Существует ли функция PHP Array Group By? - PullRequest
4 голосов
/ 03 ноября 2010
$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. Ааа, 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 ]

7 голосов
/ 03 ноября 2010
$array = array_count_values(array_map('strlen',array_keys($arr1)));

Должен дать тебе то, что ты хочешь.

Редактировать:

Ваш оригинальный код был в порядке, за исключением того, что вы должны изменить = .... на $index_length_arr[strlen($key)]

Вы использовали две разные клавиши.

4 голосов
/ 10 февраля 2016

Я бы настоятельно рекомендовал использовать lstrojny's function-php https://github.com/lstrojny/functional-php, который включает в себя group() функцию вместе с множеством других полезных концепций функционального программирования.

3 голосов
/ 18 мая 2015

Я бы порекомендовал создать свою собственную (или использовать библиотеку, которая уже делает это).Было бы что-то вроде этого (не проверял):

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; } );
0 голосов
/ 03 ноября 2010
$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);

Получает ожидаемый результат.

...