PerlerのためのPHP3
前までの2回でふと思ったこと。
sort()で破壊させないには
<?php function say($w = '') { print "$w\n"; } $ary1 = array('a', 'c', 'b', 'e', 'd'); sort($ary1); say(implode(',', $ary1)); ?>
a,b,c,d,e
PHPのsort()はPerlと違ってソーティングされた配列が返ってこない。
直接直截。
注意: ソート関数は、すべて配列自身を直接変更します。 ソートした配列を新しく作って返すわけではありません。
PHP: 配列のソート - Manual
よし、じゃあPerlっぽくこれならどうよ。
<?php function say($w = '') { print "$w\n"; } $ary1 = array('a', 'c', 'b', 'e', 'd'); sort($ary2 = $ary1); say(implode(',', $ary1)); say(implode(',', $ary2)); ?>
a,c,b,e,d a,c,b,e,d
あれ、だめか。
$ary1 までsort()の餌食にされてしまっている。
say()を書き換えて、
function say($w = '') { if (is_array($w)) { print_r($w); // print_r()は配列の中身も表示してくれる } else { print "$w\n"; } }
代入した時の返却値をチェックしてみる。
say($ary2 = $ary1);
Array ( [0] => a [1] => c [2] => b [3] => e [4] => d )
ちゃんと一個分の配列が評価されてんじゃん。
でもこれだと$ary1 なのか $ary2 なのか分からないな。
それなら試しにこうしてみる。
say($ary2 = array('f', $ary1));
Array ( [0] => f [1] => Array ( [0] => a [1] => c [2] => b [3] => e [4] => d ) )
あ、どっちにしろわからないな……。
代入時には左辺が評価されてるっぽい気がするけどじゃあなんで
sort($ary2 = $ary1);
これがだめなのか。
うーん。
ksort()を配列に対して行うと無意味か
<?php function say($w = '') { if (is_array($w)) { print_r($w); } else { print "$w\n"; } } $ary1 = $ary2 =array('a', 'c', 'b', 'e', 'd'); ksort($ary2); say(implode(',', $ary1)); say(implode(',', $ary2)); ?>
a,c,b,e,d a,c,b,e,d
そうだよね無意味だよね。
配列で$hash as $key => $valしたら要素番号取れる?
<?php function say($w = '') { if (is_array($w)) { print_r($w); } else { print "$w\n"; } } $ary1 =array('a', 'c', 'b', 'e', 'd'); foreach ($ary1 as $key => $val) { say("$key => $val"); } ?>
0 => a 1 => c 2 => b 3 => e 4 => d
わあ、やっぱり。
PerlのundefってPHPだとなに?
キーワード「NULL」らしいです。
PHP: NULL - Manual
<?php $y = NULL; $z; if ($y === $z) { print "\$y === \$z"; } ?>
$y === $z