LoginSignup
1
1

More than 5 years have passed since last update.

配列群の最大・最小長を取得するには

Last updated at Posted at 2018-01-12

概要

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で - Qiitamin版使ってました。
これが最初の目的かな?最大値にも使えるじゃん的な応用記事だったかも。


投稿後追記
投稿した直後に思いつくやつ。
配列の長さでソートすりゃあとは煮るなり焼くなりだ

<?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
        )

)
*/
1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1