Perl日記

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

PHPのarray_filterは添字を維持するので気をつけろ

やることはPerlgrepRubyのArray#selectと同じなのに、PHPのarray_filterは添字を維持してフィルタしてくれやがる。

Ruby

[10, 11, 12, 13, 14, 15, 16].select{|i| i % 2 == 1}
#=> [11, 13, 15]

PHP

<?php
array_filter([10, 11, 12, 13, 14, 15, 16], function($i){ return $i % 2; });
//=> Array
//=> (
//=>     [1] => 11
//=>     [3] => 13
//=>     [5] => 15
//=> )


なので、array_filterした結果の先頭を添え字0で取ろうとしてもとれない。

<?php
$numbers = array_filter([10, 11, 12, 13, 14, 15, 16], function($i){ return $i % 2; });
var_dump($numbers[0]);

//=> Notice: Undefined offset: 0 in php shell code on line 1

array_shiftならとれる。

<?php
echo array_shift($numbers);
//=> 11

なんだかな。