objetos - ordenar json php
Ordenar matriz multidimensional por valor (9)
Afrontémoslo: php NO tiene una función simple lista para usar para manejar adecuadamente todos los escenarios de clasificación de arreglos.
Esta rutina es intuitiva, lo que significa una depuración y mantenimiento más rápidos:
// automatic population of array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result
// $row[0] is the ID, but is populated out of order (comes from
// multiple selects populating various dimensions for the same DATE
// for example
while($row = mysql_fetch_array($result)) {
$needle = $row[0];
arrayIndexes($needle); // create a parallel array with IDs only
$annotations[$needle][''someDimension''] = $row[1]; // whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
$dataInOrder = $annotations[$arrayKey][''someDimension''];
// .... more code
}
function arrayIndexes ($needle) {
global $tempArray;
if (!in_array($needle,$tempArray)) {
array_push($tempArray,$needle);
}
}
¿Cómo puedo ordenar esta matriz por el valor de la tecla "orden"? Aunque los valores son actualmente secuenciales, no siempre lo serán.
Array
(
[0] => Array
(
[hashtag] => a7e87329b5eab8578f4f1098a152d6f4
[title] => Flower
[order] => 3
)
[1] => Array
(
[hashtag] => b24ce0cd392a5b0b8dedc66c25213594
[title] => Free
[order] => 2
)
[2] => Array
(
[hashtag] => e7d31fc0602fb2ede144d18cdffd816b
[title] => Ready
[order] => 1
)
)
El enfoque más flexible sería utilizar este método.
Arr::sortByKeys(array $array, $keys, bool $assoc = true): array
este es el por qué:
Puede ordenar por cualquier clave (también anidada como
''key1.key2.key3''
o[''k1'', ''k2'', ''k3'']
)Funciona tanto en matrices asociativas como no asociativas (
$assoc
flag)No usa referencia - devuelve nueva matriz ordenada
En tu caso sería tan simple como:
$sortedArray = Arr::sortByKeys($array, ''order'');
Este método es parte de esta biblioteca .
Para ordenar la matriz por el valor de la clave "título" use:
uasort($myArray, function($a, $b) {
return strcmp($a[''title''], $b[''title'']);
});
Strcmp compara las cuerdas.
uasort () mantiene las claves de la matriz como se definieron.
Pruebe un usort . Si todavía está en PHP 5.2 o anterior, primero tendrá que definir una función de clasificación:
function sortByOrder($a, $b) {
return $a[''order''] - $b[''order''];
}
usort($myArray, ''sortByOrder'');
A partir de PHP 5.3, puede utilizar una función anónima:
usort($myArray, function($a, $b) {
return $a[''order''] - $b[''order''];
});
Y finalmente con PHP 7 puedes usar el operador de la nave espacial :
usort($myArray, function($a, $b) {
return $a[''order''] <=> $b[''order''];
});
Para extender esto a la clasificación multidimensional, haga referencia a los elementos de clasificación segundo / tercero si el primero es cero; la mejor explicación se explica a continuación. También puede usar esto para clasificar en subelementos.
usort($myArray, function($a, $b) {
$retval = $a[''order''] <=> $b[''order''];
if ($retval == 0) {
$retval = $a[''suborder''] <=> $b[''suborder''];
if ($retval == 0) {
$retval = $a[''details''][''subsuborder''] <=> $b[''details''][''subsuborder''];
}
}
return $retval;
});
Si necesita conservar las asociaciones de claves, use uasort()
- vea la comparación de las funciones de clasificación de matrices en el manual
Un enfoque para lograr esto sería así.
$new = [
[
''hashtag'' => ''a7e87329b5eab8578f4f1098a152d6f4'',
''title'' => ''Flower'',
''order'' => 3,
],
[
''hashtag'' => ''b24ce0cd392a5b0b8dedc66c25213594'',
''title'' => ''Free'',
''order'' => 2,
],
[
''hashtag'' => ''e7d31fc0602fb2ede144d18cdffd816b'',
''title'' => ''Ready'',
''order'' => 1,
],
];
$keys = array_column($new, ''order'');
$result = array_multisort($keys, SORT_ASC, $new);
Resultado:
Array
(
[0] => Array
(
[hashtag] => e7d31fc0602fb2ede144d18cdffd816b
[title] => Ready
[order] => 1
)
[1] => Array
(
[hashtag] => b24ce0cd392a5b0b8dedc66c25213594
[title] => Free
[order] => 2
)
[2] => Array
(
[hashtag] => a7e87329b5eab8578f4f1098a152d6f4
[title] => Flower
[order] => 3
)
)
Usualmente uso usort , y paso mi propia función de comparación. En este caso, es muy simple:
function compareOrder($a, $b)
{
return $a[''order''] - $b[''order''];
}
usort($array, ''compareOrder'');
Yo uso esta función:
function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
$sort_col = array();
foreach ($arr as $key=> $row) {
$sort_col[$key] = $row[$col];
}
array_multisort($sort_col, $dir, $arr);
}
array_sort_by_column($array, ''order'');
$sort = array();
$array_lowercase = array_map(''strtolower'', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);
Esto se ocupa de los alfabetos mayúsculas y minúsculas.
function aasort (&$array, $key) {
$sorter=array();
$ret=array();
reset($array);
foreach ($array as $ii => $va) {
$sorter[$ii]=$va[$key];
}
asort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii]=$array[$ii];
}
$array=$ret;
}
aasort($your_array,"order");