Как сгруппировать массивы на основе значения в PHP? - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть следующие $array:

Array
(
[0] => Array
    (
        [cd] => 1675
        [amt_1] => 199.50
        [fname] => Joe
        [lname] => A
    )

[1] => Array
    (
        [cd] => 1675
        [amt_1] => 69.90
        [fname] => Joe
        [lname] => A
    )

[2] => Array
    (
        [cd] => 1676
        [amt_1] => 69.90
        [fname] => Tracy
        [lname] => A
    )

[3] => Array
    (
        [cd] => 1676
        [amt_1] => 199.50
        [fname] => Tracy
        [lname] => A
    )
...
)

Я пытаюсь сгруппировать их, в данном случае, по fname или cd, чтобы у меня было что-то вроде:

[0] => Array
    (
        [cd] => 1676
        Array
            (
            [0] => Array
                 (
                 [amt_1] => 199.50
                 )
            [1] => Array
                 (
                 [amt_1] => 69.90
                 )
        [fname] => Joe
        [lname] => A
    )
  [1] => Array
    (
        [cd] => 1676
        Array
            (
            [0] => Array
                 (
                 [amt_1] => 199.50
                 )
            [1] => Array
                 (
                 [amt_1] => 69.90
                 )
        [fname] => Tracy
        [lname] => A
    )
    ........   

Я не могу понять это. Это не может быть сделано в MySQL, мне нужно сделать это в PHP.

Есть идеи?

Спасибо

edit: я знаю, что пример результата не отформатирован правильно, но в основном я хочу объединить fname, а остальные результаты помещают их в массивы.

редактирование:

@Paulo H есть хорошая идея. также я нашел другой способ сделать это, объединяя это вместе, не объединяя это:

$groups = array ();
    foreach ( $the_array as $item ) {
        $key = $item ['fname'];
        if (! isset ( $groups [$key] )) {
            $groups [$key] = array ('items' => array ($item ), 'count' => 1 );
        } else {
            $groups [$key] ['items'] [] = $item;
            $groups [$key] ['count'] += 1;
        }
    }

1 Ответ

1 голос
/ 07 декабря 2011

Попробуйте это:

function &array_group_value_by($input_array,$value,$by){
    $result = array();
    foreach($input_array as $array){
        if(!isset($result[$array[$by]])){
            $result[$array[$by]] = array();
        }
        foreach($array as $key=>$data){
            if((is_string($value) && $key==$value) || (is_array($value) && in_array($key,$value))){
                if(!isset($result[$array[$by]][$key])){
                    $result[$array[$by]][$key] = array();
                }
                $result[$array[$by]][$key][] = $data;
            }else{
                $result[$array[$by]][$key] = $data;
            }
        }
    }
    return $result;
}

$grouped = array_group_value_by($yourarray,'amt_1','fname');
print_r($grouped);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...