hoe arrays te groeperen op basis van een waarde in php?

Ik heb de volgende $ 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
    )
...
)

Ik probeer te doen om ze te groeperen, in dit geval, door fname of cd zodat ik zoiets als heb:

[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
    )
    ........   

Ik kan er niet uitkomen. Dit kan niet gedaan worden in mysql, ik moet het doen in php.

Om het even welke ideeën?

Bedankt

Bewerk: Ik weet dat het resultaatvoorbeeld niet correct is opgemaakt, maar in principe wil ik de fname combineren en de rest van de resultaten plaatsen ze in arrays.

Bewerk:

@Paulo H has a good idea. also i found another way of doing it that groups it together not combining it :

$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;
        }
    }
2
Tracy ook, ik gaf slechts een voorbeeld
toegevoegd de auteur Patrioticcow, de bron
ik heb de post een beetje bewerkt, misschien is het nu duidelijker
toegevoegd de auteur Patrioticcow, de bron
De gewenste resultaatarray is verkeerd ingedeeld. Wat houdt de matrix array (0 => array ('amt_1' => 199.50 '), 1 => array (' amt_1 '=> 69.90)) vast? En hoe zou Tracy eruitzien?
toegevoegd de auteur Shad, de bron
hoe zit het met Tracy?
toegevoegd de auteur Book Of Zeus, de bron

1 antwoord

Probeer dit:

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);
1
toegevoegd
soort werken, ik heb een paar dingen veranderd en bedankt het idee
toegevoegd de auteur Patrioticcow, de bron