Сортировка элементов массива
Как я мог бы отсортировать по "start_date" следующий массив:
Примечание: data является строкой типа string (json) , после преобразования ее в Array я должен отсортировать ее по этому полю ...
я могу сделать с PHP или Javascript, как бы то ни было, но важно отсортировать его ...
Большое спасибо ... я посылаю Вам массив:
Array
(
[0] => Array
(
[Lunes] => Array
(
[id] => 1
[start_date] => 09:30
[end_date] => 10:30
[text] => Texto de Ejemplo
)
)
[1] => Array
(
[Lunes] => Array
(
[id] => 2
[start_date] => 10:30
[end_date] => 11:30
[text] => Texto de Ejemplo
)
)
[2] => Array
(
[Lunes] => Array
(
[id] => 3
[start_date] => 08:30
[end_date] => 09:30
[text] => Texto de Ejemplo
)
)
)
Такие данные я получаю следующим образом:
function test(){
$data = '[{"Lunes":{"id":1,"start_date":"10:30","end_date":"11:30","text":"Texto de Ejemplo"}},{"Miércoles":{"id":2,"start_date":"08:30","end_date":"09:30","text":"Texto de Ejemplo"}},{"Lunes":{"id":3,"start_date":"09:30","end_date":"10:30","text":"Texto de Ejemplo"}}]';
$json = json_decode(
$data,
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
);
return $json;
}
2 answers
Вы можете попробовать usort()
. Вы можете найти документацию этого здесь.
Использование этого в вашем случае будет следующим:
<?php
$datos = Array
(
Array(
"Lunes" => Array
(
"id" => 1,
"start_date" => "09:30",
"end_date" => "10:30",
"text" => "Texto de Ejemplo"
)
),
Array
(
"Lunes" => Array
(
"id" => 2,
"start_date" => "10:30",
"end_date" => "11:30",
"text" => "Texto de Ejemplo"
)
),
Array
(
"Lunes" => Array
(
"id" => 3,
"start_date" => "08:30",
"end_date" => "09:30",
"text" => "Texto de Ejemplo"
)
)
);
function cmp($a, $b)
{
if ($a["Lunes"]["start_date"] == $b["Lunes"]["start_date"]) {
return 0;
}
return ($a["Lunes"]["start_date"] < $b["Lunes"]["start_date"]) ? -1 : 1;
}
echo "Datos sin ordenar:<br><br>";
print_r($datos);
echo "<br><br>Datos ordenados:<br><br>";
usort($datos, "cmp");
print_r($datos);
?>
Это приведет к:
Несортированные данные:
Array ( [0] => Array ( [Понедельник] => Array ( [id] => 1 [start_date] => 09:30 [end_date] => 10:30 [text] => Пример Текста ) ) 1 => Array ( [Понедельник] => Array ( [id] => 2 [start_date] => 10:30 [end_date] => 11 :30 [text] = > текст Пример)) [2] => Array ([Понедельник] = > Array ( [id] => 3 [start_date] => 08:30 [end_date] => 09:30 [text] => Текст Пример ) ) )
Упорядоченные данные:
Array ( [0] => Array ( [Понедельник] => Array ( [id] => 3 [start_date] => 08:30 [end_date] => 09:30 [text] => Пример Текста ) ) 1 => Array ( [Понедельник] => Array ( [id] => 1 [start_date] => 09:30 [end_date] => 10: 30 [text] = > пример текста)) [2] = > Array ( [понедельник] = > Array ( [id] = > 2 [start_date] => 10:30 [end_date] => 11:30 [text] => Текст Пример ) ) )
Отлично @samir все хорошо, сначала это не сработало для меня, но я не понимал, потому что в вашем примере, если при его реализации я понял, что должен использовать strtotime ().
function cmp($a, $b)
{
if ($a["Sabado"]["start_date"] == $b["Sabado"]["start_date"]) {
return 0;
}
return strtotime($a["Sabado"]["start_date"]) - strtotime($b["Sabado"]["start_date"]);
//return ($a["Sabado"]["start_date"] < $b["Sabado"]["start_date"]) ? -1 : 1;
}
В день недели я не мог разместить его динамично, то, что я сделал, было функцией для каждого дня недели, это не очень элегантно, но если функционально.
Еще раз большое спасибо за помощь.