是否有PHP Array Group By功能?

时间:2010-11-03 19:21:22

标签: php arrays group-by

$arr1 = array('a' => '1', 'b' => 'blah', 'c' => 'whatever...',
              'aa' => '2', 'bb' => 'lbha', 'cc' => 'everwhat...', 'dd' => 'bingo',
              'aaa' => '3', 'bbb' => 'halb', 'ccc' => 'revetahw...');

在数组中,我有三种不同的索引长度a,b和c都是1的长度。 aa,bb,cc和dd都是2的长度。 aaa,bbb和ccc都是3个。

我要做的是找到具有最多元素和最大长度的索引(按长度分组)。

所以我会使用aa,bb,cc,dd,因为它们有4个元素,这将返回索引长度为2。

我想知道如何获得2?

这是我正在尝试的但它不起作用

foreach($arr1 as $key => $data) {
   $index_length_arr[strlen($key)] = $index_length_arr[$key] + 1;
}

结果:

Array
(
    [1] => 1
    [2] => 1
    [3] => 1
)

预期产出:

Array
(
    [1] => 3
    [2] => 4
    [3] => 3
)

然后我可以看到索引(长度为2)的元素最多:

'aa' => '2', 'bb' => 'lbha', 'cc' => 'everwhat...', 'dd' => 'bingo',

4 个答案:

答案 0 :(得分:7)

$array = array_count_values(array_map('strlen',array_keys($arr1)));

应该给你想要的东西。

修改:

您的原始代码很好,除非您必须将= ....更改为$index_length_arr[strlen($key)]

您使用了两个不同的按键。

答案 1 :(得分:4)

我强烈建议使用lstrojny的functional-php https://github.com/lstrojny/functional-php,其中包含group() function以及许多其他有用的函数式编程概念。

答案 2 :(得分:3)

我建议你自己创建(或使用已经完成它的库)。它是这样的(没有测试它):

function groupBy($array, $function)
{
    $dictionary = [];
    if ($array) {
        foreach ($array as $item) {
            $dictionary[$function($item)][] = $item;
        }
    }
    return $dictionary;
}

像这样使用它:

$usersByAge = groupBy($users, function ($age) { return $user->age; } );

答案 3 :(得分:0)

$arr1 = array('a' => '1', 'b' => 'blah', 'c' => 'whatever...',
              'aa' => '2', 'bb' => 'lbha', 'cc' => 'everwhat...', 'dd' => 'bingo',
              'aaa' => '3', 'bbb' => 'halb', 'ccc' => 'revetahw...');


$tmpArray = array();

foreach ($arr1 AS $key => $val) {
    if (empty($tmpArray)) {
            $tmpArray[strlen($key)] = 0;
    }
    $tmpArray[strlen($key)]++;
}

print_r($tmpArray);

获取您的预期结果。