概要
n
個の配列、
[1]
[2, 3]
[4, 5, 6]
があるとき、一番要素数が多い(少ない)ものの数を取得したい。
最大長
<?php
function array_count(array $array){
if (func_num_args() > 1) {
$array = func_get_args();
}
return array_reduce($array, function($max, $array){
return max($max, count($array));
}, 0);
}
$a = [1];
$b = [2, 3];
$c = [4, 5, 6];
print array_count($a, $b, $c) . "\n"; // 3
print array_count([$a,$b,$c]) . "\n"; // 3
最小長
max()
をmin()
にし、初期値は…配列の可能な長さはメモリに依存するようなので、(すごく曖昧な情報です)
適当に「これより大きい値が最小長になることは無いだろう」値を決め打ちするしかない?
あるいはPHP_INT_MAX
定数などを利用するか。
最大・最小の配列自体を取得したい
配列長はcount
で簡単に取得できるので、配列自体を返したほうが便利そう。
ここまでむかーし書いていた文章。
目的と手段の理由を既に見失ってますが、今ならarray_map
でこう書くかな。
<?php
function array_count(array $array){
if (func_num_args() > 1) {
$array = func_get_args();
}
return max(array_map(function($array) {
return count($array);
}, $array));
}
$a = [1];
$b = [2, 3];
$c = [4, 5, 6];
print array_count($a, $b, $c) . "\n"; // 3
print array_count([$a,$b,$c]) . "\n"; // 3
長さだけの配列を新しく作っちゃえば、それをmax()
,min()
にかければ初期値は要らないはず。
メモリを考慮してたのかな?
配列自体が欲しいという話は同じ長さの配列が渡されたときの要件が書かれてないのでrejectしたい。
ああ、PythonのzipをPHPで - Qiitaでmin
版使ってました。
これが最初の目的かな?最大値にも使えるじゃん的な応用記事だったかも。
投稿後追記
投稿した直後に思いつくやつ。
配列の長さでソートすりゃあとは煮るなり焼くなりだ
<?php
$a = [1];
$b = [2, 3];
$c = [4, 5, 6];
$p = [$c, $b, $a];
uasort($p, function($a, $b) {
return count($a) - count($b);
});
print_r($p);
/*
Array
(
[2] => Array
(
[0] => 1
)
[1] => Array
(
[0] => 2
[1] => 3
)
[0] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
)
*/