代码之家  ›  专栏  ›  技术社区  ›  Phill Pafford

是否有按函数分组的PHP数组?

  •  4
  • Phill Pafford  · 技术社区  · 14 年前
    $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。

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

    我想知道我怎样才能得到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 回复  |  直到 14 年前
        1
  •  7
  •   methodin    14 年前
    $array = array_count_values(array_map('strlen',array_keys($arr1)));
    

    应该给你想要的。

    你的原始代码是好的,除了你必须改变=。。。。到 $index_length_arr[strlen($key)]

    你用的是两把不同的钥匙。

        2
  •  4
  •   Centro    8 年前

    我强烈建议使用lstrojny的函数式php https://github.com/lstrojny/functional-php 其中包括 group() function

        3
  •  3
  •   Felipe Hummel    9 年前

    我建议您创建自己的(或使用已经创建的库)。可能是这样的(没有测试过):

    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; } );
    
        4
  •  0
  •   Toby    14 年前
    $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);