recorrer - ¿Cómo ordeno una matriz de PHP por un elemento anidado dentro?
recorrer array laravel (8)
Tengo una matriz como la siguiente:
Array ( [0] => Array ( ''name'' => "Friday" ''weight'' => 6 ) [1] => Array ( ''name'' => "Monday" ''weight'' => 2 ) )
Me gustaría obtener los últimos valores en esa matriz (el ''peso'') y usarlos para ordenar los elementos principales de la matriz. Por lo tanto, en este conjunto, me gustaría ordenarlo para que el elemento ''Lunes'' aparezca antes del elemento ''Viernes''.
Aquí hay una función interesante que podría ayudar:
function subval_sort($a,$subkey,$sort) {
foreach($a as $k=>$v) {
$b[$k] = strtolower($v[$subkey]);
}
if($b)
{
$sort($b);
foreach($b as $key=>$val) {
$c[] = $a[$key];
}
return $c;
}
}
Envíe la matriz como $a
la clave como $subkey
subkey y ''asort'' u ''sort'' para la variable $sort
Estoy de acuerdo con el usort, también a veces uso array_multisort ( http://ca2.php.net/manual/en/function.usort.php ) ejemplo 3, ordenando los resultados de la base de datos. Podrías hacer algo como:
<?php
$days = array(
array(''name'' => ''Friday'', ''weight'' => 6),
array(''name'' => ''Monday'', ''weight'' => 2),
);
$weight = array();
foreach($days as $k => $d) {
$weight[$k] = $d[''weight''];
}
print_r($days);
array_multisort($weight, SORT_ASC, $days);
print_r($days);
?>
Salida:
Array
(
[0] => Array
(
[name] => Friday
[weight] => 6
)
[1] => Array
(
[name] => Monday
[weight] => 2
)
)
Array
(
[0] => Array
(
[name] => Monday
[weight] => 2
)
[1] => Array
(
[name] => Friday
[weight] => 6
)
)
NOTA, si el elemento que está ordenando es un flotador como .0534 y .0353 (como un porcentaje), entonces tiene que multiplicar ambos por 1000. No estoy seguro de por qué francamente ... parece que usort parece comparar el número entero valores.
me llevó un tiempo descubrirlo ...
y 2 consejos que pueden no ser inmediatamente obvios:
- si tus arrays son objetos, puedes usar return $ a-> weight - $ b-> weight por supuesto
- si devuelve $ b-> weight - $ a-> weight, clasificará desending.
Se puede hacer usando una función anónima .
Además, si su ''peso'' es una cadena, use una de las otras declaraciones (vea las líneas comentadas):
<?php
$arr = array(
0 => array (
''name'' => ''Friday'',
''weight'' => 6,
),
1 => array (
''name'' => ''Monday'',
''weight'' => 2,
),
);
// sort by ''weight''
usort($arr, function($a, $b) { // anonymous function
// compare numbers only
return $a[''weight''] - $b[''weight''];
// compare numbers or strings
//return strcmp($a[''weight''], $b[''weight'']);
// compare numbers or strings non-case-sensitive
//return strcmp(strtoupper($a[''weight'']), strtoupper($b[''weight'']));
});
var_export($arr);
/*
array (
0 => array (
''name'' => ''Monday'',
''weight'' => 2,
),
1 => array (
''name'' => ''Friday'',
''weight'' => 6,
),
)
*/
Si el archivo que ordena es el name
title
,
array_multisort + Flags for Natural Sorting y CaseInSensitivity son el camino a seguir:
$sort_by_title = array();
foreach($items as $item) {
$sort_by_title [] = $item[''title''];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
También puedes usar una función anónima.
usort($items, function($a, $b) {
return $a[''name''] > $b[''name''];
});
prueba esto: usort
Puedes usar usort
como:
function cmp($a, $b) {
return $a[''weight''] - $b[''weight''];
}
usort($arr,"cmp");