Как отсортировать массив объектов по одному из его элементов [PHP]
в настоящее время я обнаружил, что я не могу отсортировать массив объектов, используя в качестве индекса сортировать один из его ключей.
Давайте предположим, что массив приходит так:
Array
(
[0] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2018-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[1] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
и мне нужно, чтобы все результаты были отсортированы по VALR StartDate и по убыванию, чтобы всегда иметь самую последнюю в качестве первой записи.
я попытался создать функцию сравнения
function comp($a, $b) {
if ($a < $b) return true;
else return false;
}
Создание нового массива с данные, которые я получаю
foreach ($json as $datos) {
$id = $datos->Id;
$estado = $datos->State;
$fechaIni = $datos->StartDate;
$fechaFin = $datos->EndDate;
$proceso = $datos->Configuration->ProcessId;
array_push($arrayDatos, $datos)
}
и вызывая его затем из uksort
uksort($arrayDAtos, comp(xxxx,yyyy))
но именно здесь я думаю, что я связался, потому что я не знаю, как передать функции comp значения, необходимые для сортировки по StartDate.
Давай, я не знаю ничего ясного ни о работе uksort, ни о том, что именно должна делать функция comp
2 answers
Вы можете использовать в действительности usort
, если вы не возражаете против изменения (числовых) индексов нового массива, в противном случае вы можете использовать uasort
. Обе функции поддерживают функцию в качестве параметра, где мы указываем, как мы хотим порядок. В этом случае мы будем использовать нашу функцию object_sorter
.
Я предлагаю эту функцию, несколько продвинутую и, безусловно, улучшаемую, которая предлагает следующие преимущества:
- Вы можете повторно использовать его для Сортировать по любому ключевые объекта, который будет проводится в параметр
- Поддерживает параметр порядка дополнительно (
DESC
), если вы хотите заказать формуDESC
endente. - Использовании
strnatcmp
, пользуясь его преимуществами, чтобы сделать сравнение.
Функция просто так:
function object_sorter($clave,$orden=null) {
return function ($a, $b) use ($clave,$orden) {
$result= ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) : strnatcmp($a->$clave, $b->$clave);
return $result;
};
}
И чтобы использовать его, вы просто передаете ему массив.
-
Чтобы вы сортировали его по ключу
ASC
StarDate
:usort($objDatos, object_sorter('StartDate'));
-
Чтобы вы сортировали его по ключу
DESC
StarDate
:usort($objDatos, object_sorter('StartDate','DESC'));
Полный Тест:
<?php
/*PHP: Ordenar array de objetos por uno de sus miembreos con usort - https://es.stackoverflow.com/q/161586/29967*/
/*Función*/
function object_sorter($clave,$orden=null) {
return function ($a, $b) use ($clave,$orden) {
$result= ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) : strnatcmp($a->$clave, $b->$clave);
return $result;
};
}
/*Objeto original*/
$objDatos =
array(
0 => (object) array(
'Id' => 'e6930148-319f-4b87-bb57-8aae98adfc55',
'State' => 'FINISHED',
'StartDate' => '2019-05-03T08:57:30+02:00',
'EndDate' => '2018-05-03T08:59:17+02:00'
),
1 => (object) array(
'Id' => '4263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
'State' => 'FINISHED',
'StartDate' => '2018-05-03T10:15:39+02:00',
'EndDate' => '2018-05-03T10:15:58+02:00'
),
3 => (object) array(
'Id' => '5263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
'State' => 'FINISHED',
'StartDate' => '2020-05-03T10:15:39+02:00',
'EndDate' => '2018-05-03T10:15:58+02:00'
),
);
/*Original*/
echo "OBJETO ORIGINAL:".PHP_EOL.PHP_EOL;
print_r($objDatos);
/*Orden por defecto (ASCendente)*/
usort($objDatos, object_sorter('StartDate'));
echo PHP_EOL.PHP_EOL."ORDEN ASCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);
/*Orden DESCendente (indicándolo en parámetro)*/
usort($objDatos, object_sorter('StartDate','DESC'));
echo PHP_EOL.PHP_EOL."ORDEN DESCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);
?>
Результат:
ИСХОДНЫЙ ОБЪЕКТ:
Array
(
[0] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[1] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[3] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
ПОРЯДОК ВОЗРАСТАНИЯ:
Array
(
[0] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[1] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[2] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
ПОРЯДОК УБЫВАНИЯ:
Array
(
[0] => stdClass Object
(
[Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2020-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
[1] => stdClass Object
(
[Id] => e6930148-319f-4b87-bb57-8aae98adfc55
[State] => FINISHED
[StartDate] => 2019-05-03T08:57:30+02:00
[EndDate] => 2018-05-03T08:59:17+02:00
)
[2] => stdClass Object
(
[Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
[State] => FINISHED
[StartDate] => 2018-05-03T10:15:39+02:00
[EndDate] => 2018-05-03T10:15:58+02:00
)
)
Я надеюсь, что это полезно для вас.
Примечание: функция которые мы можем адаптировать, улучшить и включить в нашу утилитарную библиотеку кода.
Вы можете сделать это с помощью usort asi:
function date_compare($a, $b)
{
$t1 = strtotime($a['startDate']);
$t2 = strtotime($b['startDate']);
return $t1 - $t2;
}
usort($arrayDatos, 'date_compare');