PHP7.1とPHP 5.6のバージョンでforeachとstringの違い
4296 ワード
ちょうどポインタでアルゴリズムの問題に解答して、いくつかの問題を連想して、ここで記録します
PHP5.6の出力は次のとおりです.
PHP7.1の出力は次のとおりです.
区別する PHP5.6の配列が遍歴した後、移動のポインタで、移動したり移動したりして、配列の有効範囲内ではありません.したがって、様々な動作がNULLまたはfalse である PHP7.1では、巡回後もポインタは配列のヘッダに残っている.値に従ってループするとforeachはその配列のコピー操作であり、元の配列ポインタは移動しないため、ポインタ操作を継続することができる.
PHP7.1出力は以下の通り結果から分かるように、next()は配列の最後の位置に着いた後、next()を行ってfalseに戻り、5.6のforeachと同じである.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
次にstringのすべての違いについてお話しします次のコードを見てください.ローマ数字を整数 に変換します.用PHP 5.6運転、結果は58, 用PHP 7.1運転結果56,245,679,182
原因分析 という2行のコードは 用PHP 5.6実行、Notice:Uninitialized string offset:-1 用PHP 7.1実行、結果I PHP 7は逆インデックスをサポートしており、ソースコードを確認すると、プラスとマイナスのインデックスを入力しても、最終的には正のインデックスに変わります.
まとめ
foreachを使用する場合は、PHPバージョンに注意し、違いの原因を知る必要があります.1つは元の配列ポインタを移動し、1つはコピーを移動するポインタです.原理を理解してこそ、よりよく使用することができます.stringを使用してインデックスが存在するか否かの判断は、PHPバージョン、$str[-1]がPHP 5にあることに注意する.6の中で文字列の前のアドレスを代表して、明らかに存在しないで、PHP 7の中で後ろから前へ数えて第1の文字を代表します.作業中に複数のPHPバージョンを使用する猿たちは互換性のある処理を行い、問題を避けることをお勧めします.
$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
区別する
$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
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
次に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
原因分析
$s = "LVIII";
echo $s[-1];exit;
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バージョンを使用する猿たちは互換性のある処理を行い、問題を避けることをお勧めします.