Perl日記

PerlとかRubyとかPHPとかPythonとか

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