PHP7.1とPHP 5.6のバージョンでforeachとstringの違い

4296 ワード

ちょうどポインタでアルゴリズムの問題に解答して、いくつかの問題を連想して、ここで記録します
$arr = array( 1 => "start", 'wd' =>111, 3 => 333, "lz" => 4444, 55 =>"end" );

// foreach   PHP5.6                ,  PHP7     
foreach($arr as $key => $value){
    echo "
$key =>$value"; } $k = key($arr); // foreach , $v = current($arr); // foreach , $res = next($arr); // foreach , next() echo "
( ),“ ” :"; var_dump($k); echo "
( ), “ ” :"; var_dump($v); echo "
( ), :"; var_dump($res); exit;

PHP5.6の出力は次のとおりです.
// $arr = array( 1 => "start", 'wd' =>111, 3 => 333, "lz" => 4444, 55 =>"end" );  //      

1 =>start        //        
wd =>111            
3 =>333
lz =>4444
55 =>end

  (    ),“  ” :NULL
  (    ),  “ ” :bool(false)
  (    ),           :bool(false)

PHP7.1の出力は次のとおりです.
1 =>start
wd =>111
3 =>333
lz =>4444
55 =>end
  (    ),“  ” :int 1

  (    ),  “ ” :string 'start' 

  (    ),           :int 111

区別する
  • PHP5.6の配列が遍歴した後、移動のポインタで、移動したり移動したりして、配列の有効範囲内ではありません.したがって、様々な動作がNULLまたはfalse
  • である
  • PHP7.1では、巡回後もポインタは配列のヘッダに残っている.値に従ってループするとforeachはその配列のコピー操作であり、元の配列ポインタは移動しないため、ポインタ操作を継続することができる.
  • $arr = array( 1 => "start", 'wd' =>111, 3 => 333, "lz" => 4444, 55 =>"end" );
    foreach($arr as $key => $value){
        echo current($arr);            //      start,   $arr       
        // echo "
    $key =>$value"; } $k = key($arr); $v = current($arr); $res = next($arr); echo "
    ( ),“ ” :"; var_dump($k); echo "
    ( ), “ ” :"; var_dump($v); echo "
    ( ), :"; var_dump($res); $res = next($arr); // next() , $res = next($arr); $res = next($arr); $res = next($arr); echo "
    (next ), :"; var_dump($res); exit;

    PHP7.1出力は以下の通り
    startstartstartstartstart
    
      (    ),“  ” :
    D:\workspace\gitlab\water.service.klagri.com.cn\dev\index.php:10:int 1
    
      (    ),  “ ” :
    D:\workspace\gitlab\water.service.klagri.com.cn\dev\index.php:11:string 'start' (length=5)
    
      (    ),            :
    D:\workspace\gitlab\water.service.klagri.com.cn\dev\index.php:12:int 111
    
      (next        ),            :
    D:\workspace\gitlab\water.service.klagri.com.cn\dev\index.php:17:boolean false
  • 結果から分かるように、next()は配列の最後の位置に着いた後、next()を行ってfalseに戻り、5.6のforeachと同じである.

  • --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    次にstringのすべての違いについてお話しします
  • 次のコードを見てください.ローマ数字を整数
  • に変換します.
        $s = "LVIII";   //     58
        $rome = ["I"=>1, 'V'=>5, 'X'=>10, 'L'=>50, 'C'=>100, 'D'=>500, 'M'=>1000];
        $len = strlen($s);
        $sum = 0;
        for($i=0; $i
  • 用PHP 5.6運転、結果は58,
  • 用PHP 7.1運転結果56,245,679,182
    原因分析
     $s = "LVIII";
     echo $s[-1];exit;
  • という2行のコードは
  • 用PHP 5.6実行、Notice:Uninitialized string offset:-1
  • 用PHP 7.1実行、結果I
  • PHP 7は逆インデックスをサポートしており、ソースコードを確認すると、プラスとマイナスのインデックスを入力しても、最終的には正のインデックスに変わります.
  •      if (UNEXPECTED(Z_STRLEN_P(container) < (size_t)((offset < 0) ? -offset : (offset + 1)))) {
    (gdb) s
        1861 ? (zend_long)Z_STRLEN_P(container) + offset : offset;
                 ,         。   zend_string_init        
    
        zend_string_init (persistent=0, len=1, str=0x7ffff145563c "I") //str 73 I ASCII 
        memcpy(ZSTR_VAL(ret), str, len);
    
          ,          ,      ,       ,      
    
      ,      ,               。

    まとめ
    foreachを使用する場合は、PHPバージョンに注意し、違いの原因を知る必要があります.1つは元の配列ポインタを移動し、1つはコピーを移動するポインタです.原理を理解してこそ、よりよく使用することができます.stringを使用してインデックスが存在するか否かの判断は、PHPバージョン、$str[-1]がPHP 5にあることに注意する.6の中で文字列の前のアドレスを代表して、明らかに存在しないで、PHP 7の中で後ろから前へ数えて第1の文字を代表します.作業中に複数のPHPバージョンを使用する猿たちは互換性のある処理を行い、問題を避けることをお勧めします.