$ Str bir dizenin ilk karakterini Başlarken [0]

8 Cevap php

Ben bir dize ilk harfini almak istiyorum ve ben $str[0] büyük işler olduğunu fark ettik. Ben sadece bu gösterimde genellikle diziler ile kullanıldığı gibi, bu, 'iyi uygulama' olup olmadığından emin değilim. Bu özellik, bu yüzden hepsi doğru olmadığını söyle, çocuklar için dönüyorum çok iyi belgelenmiş olması görünmüyor - her bakımdan - Bu notasyonu kullanmak için?

Veya sadece iyi ol 'sadık olmalıdır substr($str, 0, 1)?

Ayrıca, kaşlı ($str{0}) de çalıştığını kaydetti. Bu ne ile oluyor?

8 Cevap

Evet. Dizeler Char Dizilerin olarak görülebilir, ve bir dizinin bir pozisyon erişmek için yol [] operatörünü kullanmaktır, bu nedenle orada hiçbir sorun $str[0] kullanarak tüm (ve ben ' m oldukça emin çok substr yöntem daha hızlı) olduğunu.

{} Sözdizimi PHP 6 olarak önerilmemektedir. Köşeli parantezler önerilir.

Bunların her ikisi substr($str, 0, 1) bir dizenin ilk karakterini almak için çalışmak ve süre $str[0] substr kullanarak iyi bir yöntemdir. Sana bunu söylemek neden hızlı bir örnek vereceğim.

Sadece $ _POST bir kısmından ilk karakterini istiyorsunuz diyelim, 'tip' diyoruz sağlar. Ve bu $ _POST ['type'] 'Control' şu anda. Bu durumda $_POST['type'][0] kullanmak veya substr($_POST['type'], 0, 1) geri C alırsınız eğer.

Ancak, istemci tarafı örneğin type[] için type, onlar size gönderebilir verileri değiştirmek ve daha sonra 'Control' ve bu dizi için veri olarak 'Test' göndermek olsaydı substr($_POST['type'], 0, 1) sadece sadece başarısız olur ise, $_POST['type'][0] şimdi C return Control ziyade olacaktır.

Yani evet, orada $str[0] kullanarak bir sorun olabilir, ama bu çevredeki keyfiyetine bağlıdır olabilir.

Benim tek şüphesiz bu teknik çok bayt dizeleri nasıl olacağını geçerli olacağını, ama bu göz değil ise, o zaman ben size kapalı konum şüpheleniyoruz. (Şüpheniz varsa, substr bir besbelli güvenli bir seçim gibi görünüyor.)

Ancak, büyük resmi bir bakış açısıyla, ben bu önemli bir göz olması için bir dizesinde 'n'th karaktere erişmek için gereken ne sıklıkta merak var.

Bir fani olarak konuşan, ben $str[0] sopa ile olur. Bildiğim kadarıyla bana kalırsa, o substr($str, 0, 1) daha bakışta $str[0] anlamını kavramak için hızlı. Bu muhtemelen bir tercih meselesi aşağı kaynar.

Bildiğim kadarıyla performans gider gibi, iyi, profil profil. :) Ya da PHP kaynak koduna meslektaşların olabilir ...

Ben hiçbir kötü yan etkileri ve hiçbir yanlış anlamalar ile, hem de daha önce bu gösterimde kullandım. Bu mantıklı - bir dize sonuçta karakterlerin sadece bir dizidir.

Eğer substr yerine array yaklaşımı kullanırsanız Aslında, size ortalama, zaman çift harcarsınız.

Komut feryat çalıştırın ve kendiniz görün ;)

<?php
for ($i = 0; $i < 1000; $i++)
{
    $string = md5(rand());
    $position = rand(0, strlen($string) - 1);

    $start1 = microtime(true);
    $char1 = $string[$position];
    $end1 = microtime(true);
    $time1[$string] = $end1 - $start1;
    echo 'it took '. $time1[$string] .' microseconds to "array" '
        .'find char at position "'. $position .'" of string "'
        . $string .'" is "'. $char1 .'"'. PHP_EOL;

    $start2 = microtime(true);
    $char2 = substr($string, $position, 1);
    $end2 = microtime(true);
    $time2[$string] = $end2 - $start2;
    echo 'it took '. $time2[$string] .' microseconds to "substr" '
        .'find char at position "'. $position .'" of string "'
        . $string .'" is "'. $char2 .'"'. PHP_EOL;
}

$avg1 = array_sum($time1) / count($time1);
echo 'the average time using "array" is '. $avg1 . PHP_EOL;

$avg2 = array_sum($time2) / count($time2);
echo 'the average time using "substr" is '. $avg2 . PHP_EOL;
?>

Aşağıdaki düşünün:

<?php
var_dump($_POST);

// Post var is a string:
echo '1'; var_dump( strtoupper( $_POST['flag1'][0] ) === 'T' );            // boolean true
echo '2'; var_dump( strtoupper( substr( $_POST['flag1'],0,1 ) ) === 'T' ); // boolean true

// Post var is an array of strings
echo '5'; var_dump( strtoupper( $_POST['flag2'][0] ) === 'T' );            // boolean false
echo '6'; var_dump( strtoupper( substr( $_POST['flag2'],0,1 ) ) === 'T' ); // generates a PHP warning
?>
<hr />
<form method="POST">
 <input type="text" name="name" value="bob" /><br />
 <input type="text" name="flag1" value="true" /><br />
 <select name="flag2[]" multiple>
  <option value="true" selected>true</option>
  <option value="false" selected>false</option>
  <option value="0" selected>0</option>
 </select><br />
 <input type="submit" value="Submit" /><br />
</form>

Niyeti bir boolean bayrak tespit etmektir. Bu substr () işlevi bir hata üretir, oysa dizi-indis notasyonu güvenli bir yanlış sonuç üretir kullanarak, bir dizi tipi içine VAR çevirerek sorunu karıştırmamak mümkün olsa. Burada seçim göz önüne alındığında, ben simge gösterimi ile gitmek istiyorum.