পিএইচপি - স্ট্রিং অক্ষরগুলিতে পুনরাবৃত্তি


120

কোনও স্ট্রিংয়ের চরিত্রগুলিতে পুনরাবৃত্তি করার কোনও দুর্দান্ত উপায় আছে? আমি কাজ করতে সক্ষম হতে চাই foreach, array_map, array_walk, array_filterএকটি স্ট্রিং অক্ষর ইত্যাদি।

টাইপ কাস্টিং / জাগলিং আমাকে কোথাও পেল না (অ্যারের উপাদান হিসাবে পুরো স্ট্রিংটি রাখুন), এবং আমি যে সেরা সমাধানটি পেয়েছি তা হল অ্যারেটি তৈরির জন্য লুপের জন্য কেবল ব্যবহার করা। এটির মতো আরও ভাল কিছু হওয়া উচিত বলে মনে হয়। মানে, আপনি যদি এটিতে সূচক করতে পারেন তবে আপনিও পুনরাবৃত্তি করতে সক্ষম হবেন না?

এটি আমার কাছে সেরা

function stringToArray($s)
{
    $r = array();
    for($i=0; $i<strlen($s); $i++) 
         $r[$i] = $s[$i];
    return $r;
}

$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array

$ascval = array_map('ord', $arr);  //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);

হয় আছে:

ক) স্ট্রিংটিকে পুনরাবৃত্তিযোগ্য করার একটি উপায়
খ) স্ট্রিং থেকে অক্ষর অ্যারে তৈরি করার একটি আরও ভাল উপায় (এবং যদি তা হয় তবে অন্য দিক সম্পর্কে কীভাবে?)

আমার মনে হচ্ছে আমি এখানে স্পষ্ট কিছু মিস করছি।


আপনি যেটি সম্পাদন করার চেষ্টা করছেন সে সম্পর্কে আপনার আরও কিছু বলা উচিত ... মনে হচ্ছে সাধারণ স্ট্রিং ক্রিয়াকলাপগুলি ব্যবহার করে এটি করার আরও ভাল উপায় হতে পারে।
বিনয় পাই

1
এখানে একটি বাস্তব উদ্দেশ্য আছে না। আমি যে কৌতুহল নিয়ে খেলছিলাম। অদ্ভুত বলে মনে হয়েছিল যে আপনি স্ট্রিংগুলিতে সূচক করতে পারেন তবে আপনি পুনরাবৃত্তি করতে পারবেন না। এমনকি আমি অর্থপূর্ণ উদাহরণ ব্যবহারগুলি ভাবতেও
ক্ষতিগ্রস্থ হয়ে

যদিও এটি ভাল কথা, অবশ্যই আমার উদাহরণগুলি বেশ অগভীর। অর্থাত্ - বেশিরভাগই array_filterআপনি এই অর্থে কিছু করতে চাইলে স্ট্রিং বা রেজি-প্রাক্তন ফাংশনগুলি দিয়ে আরও ভাল করা যায়
jon_darkstar

সমাধান projecteuler.net/problem=20 (যদিও কিছুটা কল্পিত) ব্যবহারের ক্ষেত্রে একটি উদাহরণ হতে পারে।
নিক এডওয়ার্ডস

একটি নোট, ($ i = 0; $ i <strlen () s); $ i++) এর জন্য আমি লুপিংয়ের আগে স্ট্রেন () গুলি) একটি ভেরিয়েবলে সংরক্ষণ করব, এভাবে আপনি আর স্ট্রেন () এর চেয়ে বেশি কল করবেন না 1 বার
আমিন

উত্তর:


176

পদক্ষেপ 1:str_split ফাংশনটি ব্যবহার করে স্ট্রিংটিকে একটি অ্যারেতে রূপান্তর করুন

$array = str_split($your_string);

পদক্ষেপ 2: নতুন তৈরি করা অ্যারের মধ্য দিয়ে লুপ করুন

foreach ($array as $char) {
 echo $char;
}

আপনি আরও তথ্যের জন্য পিএইচপি ডক্স পরীক্ষা করতে পারেন: str_split


হা হা বাহ! হ্যাঁ, এটা এবং অবশ্যই ইমপ্লোড অন্য দিকটি করতে পারে। কেউ যদি স্টিং
jon_darkstar

@ জোন_ডার্কস্টার আমি আপনার আবেদনটি জানি না, তবে খেয়াল রাখবেন যে অ্যারেতে প্রতিটি প্রবেশের একটি গুরুত্বপূর্ণ ওভারহেড রয়েছে (4 বাইটস আইআইআরসি)। : কর যে, এটা 'বেশ' পথ বেশি nikic.github.com/2011/12/12/...
Daan Timmer

str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.- তো str_splitইউনিকোড সঙ্গে কাজ করতে পারবে না
শুভ

85

ইটারেট স্ট্রিং:

for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}

7
এটি একটি উত্তরের উত্তরের মতো বলে মনে হচ্ছে কারণ এটি প্রশ্নের উত্তর দেয় - অর্থাত্ 'অ্যারে রূপান্তর করতে' এর বিপরীতে কোনও স্ট্রিংয়ের মাধ্যমে কীভাবে পুনরাবৃত্তি করা যায়।
রবিন অ্যান্ড্রুজ

2
হাঃ হাঃ হাঃ!!!!! সমস্ত কিছু @ ওমতারিক। প্রদত্ত উত্তরের তুলনায় এটি অনেক বেশি দক্ষ।
0x476f72616e

5
শুধু খেয়াল করুন যে আপনি strlen()প্রতিটি পুনরাবৃত্তি কল করছেন । কোনও ভয়ানক জিনিস নয়, যেহেতু পিএইচপি-র দৈর্ঘ্য পূর্বনির্ধারিত, তবে এখনও একটি ফাংশন কল। আপনার যদি গতির প্রয়োজন হয় তবে লুপটি শুরু করার আগে এটিকে ভেরিয়েবলে আরও ভাল সংরক্ষণ করুন।
ভিলেক্স-

2
এটি মাল্টিবাইট স্ট্রিংয়ের পক্ষে ভাল নয়, কারণ এখানে আমরা বাইট অফসেট
পাচ্ছি,

2
@ ওমতারিক "এটিই উত্তর। বিশ্বের কী ভুল?" .... বিশ্বের সাথে ভুলটি হ'ল পৃথিবীর ইংরেজি ছাড়াও অন্যান্য ভাষাগুলি রয়েছে, এ্যালভারি অনুসারে এই ফাংশনটি স্ট্রিংয়ের বাইটগুলি পুনরুক্ত করবে, অক্ষর নয় not
হিসাবরক্ষক

20

আপনি ব্যবহার করা উচিত আপনার স্ট্রিং ইউনিকোড হয়ে থাক preg_splitসঙ্গে /uপরিবর্তক

পিএইচপি ডকুমেন্টেশনে মন্তব্যগুলি থেকে:

function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 

1
মাল্টিবাইট স্ট্রিংয়ের জন্য, mb_splitআরও নির্ভরযোগ্য।
ইলেক্ট্রা

12

আপনি যদি কেবল এটির অ্যাক্সেসের প্রয়োজন হয় তবে আপনি কেবল অ্যারের মতো 1 s1 অ্যাক্সেস করতে পারেন:

$s1 = "hello world";
echo $s1[0]; // -> h

6

@ সিবাইরাইট সিস্টেমগুলি উত্তর থেকে প্রসারিত, আপনি এটি চেষ্টা করতে পারেন:

$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array

আমি দ্বিমত পোষণ করছি, এই উত্তরটি মান যোগ করে না, এটি পিএইচপি অ্যাপ্লিকেশনটিতে কীভাবে str_split কাজ করতে পারে তার একটি কার্যকরী উদাহরণ দেয়। @ সিট্রেইটসিসটেমস কেবলমাত্র ডকুমেন্টেশনের সাথে লিঙ্ক করে যা কোনও ব্যক্তি কোনও উদাহরণ কীভাবে কোনও ফাংশন কীভাবে কাজ করতে পারে তা দেখার চেষ্টা করার সময় এটি কখনই সহায়ক হয় না। অন্যথায় বেশিরভাগ SO উত্তরগুলি কেবলমাত্র php.net
kdttpage

6

যারা পিএইচপি-তে স্ট্রিংগুলির ওপরে পুনরাবৃত্তি করার দ্রুততম উপায় সন্ধান করছেন, তাদের জন্য একটি বেঞ্চমার্ক পরীক্ষা প্রস্তুত করা হয়েছে।
প্রথম পদ্ধতিতে আপনি স্ট্রিং অক্ষরগুলিতে সরাসরি ব্র্যাককেটে এর অবস্থান নির্দিষ্ট করে এবং অ্যারের মতো স্ট্রিংয়ের আচরণ করে:

$string = "a sample string for testing";
$char = $string[4] // equals to m

আমি নিজেই ভেবেছিলাম দ্বিতীয়টি দ্রুততম পদ্ধতি, তবে আমি ভুল ছিলাম।
দ্বিতীয় পদ্ধতি হিসাবে (যা স্বীকৃত উত্তরে ব্যবহৃত হয়):

$string = "a sample string for testing";
$string = str_split($string);
$char = $string[4] // equals to m

এই পদ্ধতিটি দ্রুততর কারণ হতে চলেছে আমরা একটি আসল অ্যারে ব্যবহার করছি এবং একে অ্যারে হিসাবে ধরে নিচ্ছি না।

উপরোক্ত প্রতিটি পদ্ধতির শেষ লাইনটিকে 1000000সময়ের জন্য কল করা এই বেঞ্চমার্কিং ফলাফলগুলিতে নেতৃত্ব দেয়:

স্ট্রিং ব্যবহার করে [i]
0.24960017204285 Seconds

আরআর_স্প্লিট ব্যবহার করা হচ্ছে
0.18720006942749 Seconds

যার অর্থ দ্বিতীয় পদ্ধতিটি দ্রুততর।


3

হুম ... জিনিসগুলিকে জটিল করার দরকার নেই। বেসিকগুলি সর্বদা দুর্দান্ত কাজ করে।

    $string = 'abcdef';
    $len = strlen( $string );
    $x = 0;

ফরোয়ার্ড দিকনির্দেশ:

while ( $len > $x ) echo $string[ $x++ ];

আউটপুট: abcdef

উল্টো পথে:

while ( $len ) echo $string[ --$len ];

আউটপুট: fedcba


2
// Unicode Codepoint Escape Syntax in PHP 7.0
$str = "cat!\u{1F431}";

// IIFE (Immediately Invoked Function Expression) in PHP 7.0
$gen = (function(string $str) {
    for ($i = 0, $len = mb_strlen($str); $i < $len; ++$i) {
        yield mb_substr($str, $i, 1);
    }
})($str);

var_dump(
    true === $gen instanceof Traversable,
    // PHP 7.1
    true === is_iterable($gen)
);

foreach ($gen as $char) {
    echo $char, PHP_EOL;
}

আমি অবাক হয়েছি এই উত্তরটি মাত্র 1 টি আপগেট পেয়েছে :( এটি এখানে সবচেয়ে সর্বাধিক / একমাত্র নির্ভরযোগ্য উত্তর
হিসাবরক্ষক

1

বেশিরভাগ উত্তর অ ইংরেজী অক্ষরের কথা ভুলে গেছে !!!

strlenBYTES কে অক্ষর হিসাবে গণনা করা হয়, এজন্যই এটি এবং এর ভাইবোন ফাংশনগুলি ইংরাজী অক্ষরগুলির সাথে সূক্ষ্মভাবে কাজ করে, কারণ ইংরেজি অক্ষরগুলি ইউটিএফ -8 এবং এএসসিআইআই উভয় এনকোডিংগুলিতে 1 বাইটে সংরক্ষণ করা হয়, আপনাকে মাল্টিবাইট স্ট্রিং ফাংশন ব্যবহার করতে হবে mb_*

এটি এনকোডযুক্ত যে কোনও অক্ষরের সাথে কাজ করবেUTF-8

// 8 characters in 12 bytes
$string = "abcdأبتث";

$charsCount = mb_strlen($string, 'UTF-8');
for($i = 0; $i < $charsCount; $i++){
    $char = mb_substr($string, $i, 1, 'UTF-8');
    var_dump($char);
}

এই আউটপুট

string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(2) "أ"
string(2) "ب"
string(2) "ت"
string(2) "ث"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.