2010-02-03 9 views
25

Afortunadamente, puedo explicar esto correctamente ...¿Agrupe una matriz multidimensional por un valor particular?

Tengo una matriz multidimensional y estoy tratando de agruparlos según el valor de una de las teclas.

Por lo tanto, estoy tratando de agruparlos por nivel, pero en realidad no sabré el nivel de antemano. Por lo tanto, no es como si pudiera ponerlo en un ciclo for y decir mientras $ i < 7, porque no sabré que 7 es el valor máximo para la tecla de nivel y, francamente, no estoy seguro de que así sea tendría que hacerlo incluso si lo hiciera ...

Array (
    [0] => Array (
      [cust] => XT8900 
      [type] => standard 
      [level] => 1 
     ) 
    [1] => Array (
      [cust] => XT8944 
      [type] => standard 
      [level] => 1 
     ) 
    [2] => Array (
      [cust] => XT8922 
      [type] => premier 
      [level] => 3 
     ) 
    [3] => Array (
      [cust] => XT8816 
      [type] => permier 
      [level] => 3 
     ) 
    [4] => Array (
      [cust] => XT7434 
      [type] => standard 
      [level] => 7 
     ) 
) 

lo que espero para producir:

Array (

    [1] => Array (
      [0] => Array (
        [cust] => XT8900 
        [type] => standard 
        ) 
      [1] => Array (
        [cust] => XT8944 
        [type] => standard 
        ) 
     ) 

    [3] => Array (
      [2] => Array (
       [cust] => XT8922 
       [type] => premier 
       ) 

      [3] => Array (
       [cust] => XT8816 
       [type] => permier 
       ) 
     ) 

    [7] => Array (
      [4] => Array (
       [cust] => XT7434 
       [type] => standard 
       ) 
     ) 
) 

Respuesta

9

es necesario agruparlos por nivel primera

uso foreach para entrar en ar cheque ray si el nivel es el mismo con el elemento anterior entonces grupo con esa matriz

$templevel=0; 

    $newkey=0; 

    $grouparr[$templevel]=""; 

    foreach ($items as $key => $val) { 
    if ($templevel==$val['level']){ 
    $grouparr[$templevel][$newkey]=$val; 
    } else { 
    $grouparr[$val['level']][$newkey]=$val; 
    } 
    $newkey++;  
    } 
print($grouparr); 

La salida del de impresión ($ grouparr); mostrará como el formato que usted esperaba

También puede tratar de

print($grouparr[7]); 

Mostrará

[7] => Array (
     [4] => Array (
      [cust] => XT7434 
      [type] => standard 
      ) 
    ) 

O

print($grouparr[3]); 

mostrará

[3] => Array (
     [2] => Array (
      [cust] => XT8922 
      [type] => premier 
      ) 

     [3] => Array (
      [cust] => XT8816 
      [type] => permier 
      ) 
    ) 
34

La mejor manera, si tiene control sobre la creación de la matriz inicial, es simplemente configurar las cosas al principio a medida que agrega entradas.

Si no, entonces construir una matriz temporal para ordenar:

foreach ($input_arr as $key => &$entry) { 
    $level_arr[$entry['level']][$key] = $entry; 
} 

te deja con la forma que quería y todo lo que se hace referencia en conjunto.

Construya la matriz así en primer lugar, si es posible.

5

Aquí está la solución aterricé por un problema idéntico, envuelto como una función:

function arraySort($input,$sortkey){ 
    foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val; 
    return $output; 
} 

Para ordenar $ myarray por la clave denominada "nivel" acaba de hacer esto:

$myArray = arraySort($myArray,'level'); 

O si no lo quería como una función, solo para un uso único, esto crearía $ myNewArray de $ myArray agrupado por la clave 'nivel'

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val; 
+0

esta es una respuesta tan útil. Estoy tratando de usar esto, pero para que $ val sea un valor único. Sugerencias? –

6
function group_assoc($array, $key) { 
    $return = array(); 
    foreach($array as $v) { 
     $return[$v[$key]][] = $v; 
    } 
    return $return; 
} 

//Group the requests by their account_id 
$account_requests = group_assoc($requests, 'account_id'); 
2
$result = array(); 
    foreach ($yourArrayList as $data) { 
     $id = $data['level']; 
     if (isset($result[$id])) { 
      $result[$id][] = $data; 
     } else { 
      $result[$id] = array($data); 
     } 
    } 
0
function _group_by($array,$key,$keyName) 
    { 
      $return = array(); 

      foreach($array as $val) { 
       $return[$keyName.$val[$key]][] = $val; 
      } 
     return $return; 

    } //end of function 
Cuestiones relacionadas