por - php order array multidimensional by field
¿Agrupar una matriz multidimensional por un valor particular? (6)
Con suerte, puedo explicar esto correctamente ...
Tengo una matriz multidimensional y estoy tratando de agruparlos según el valor de una de las teclas.
Entonces, 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 como yo 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 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
)
)
)
Aquí está la solución en la que me conecté para 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 llamada "nivel" simplemente haz esto:
$myArray = arraySort($myArray,''level'');
O si no lo quiere como una función, solo para un uso de una vez, esto crearía $ myNewArray de $ myArray agrupados por la clave ''nivel''
foreach ($myArray as $key=>$val) $myNewArray[$val[''level'']][]=$val;
Debes agruparlos por nivel primero
Use foreach para ingresar al control de array si el nivel es el mismo que el elemento anterior y luego agrúpelo con ese conjunto
$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);
El resultado de impresión ($ grouparr); se mostrará como el formato que esperaba
También puedes intentar
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
)
)
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, construya una matriz temporal para ordenar:
foreach ($input_arr as $key => &$entry) {
$level_arr[$entry[''level'']][$key] = $entry;
}
Te deja con la forma que querías y todo lo que se hace referencia juntos.
Construya la matriz así en primer lugar, si es posible.
$result = array();
foreach ($yourArrayList as $data) {
$id = $data[''level''];
if (isset($result[$id])) {
$result[$id][] = $data;
} else {
$result[$id] = array($data);
}
}
function _group_by($array,$key,$keyName)
{
$return = array();
foreach($array as $val) {
$return[$keyName.$val[$key]][] = $val;
}
return $return;
} //end of function
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'');