Как использовать array_multisort() для сортировки массива объектов в PHP?
Я изо всех сил пытаюсь заставить array_multisort() работать. Я сортирую некоторые данные, полученные из JSON, которые представляют собой массив из пяти объектов, каждый из которых содержит данные для сообщений в блоге в следующем формате:
"1":{"title": "It's a fixer-upper of a planet but we could make it work",
"post_date": "1454889600",
"author": "Elon Musk",
"content": "<p>We choose to go to the moon in this decade and do the other things...</p>",
"category": [ "mars", "space travel" ] },
"2":{"title": "Failure is not an option",
"post_date": "1456099200",
"author": "Gene Kranz",
"content": "<p>Dinosaurs are extinct today because ...</p>",
"category": [ "mis-quoted", "apollo 13" ] },
...так далее
Я получаю файл на PHP, декодирую JSON в ассоциативный массив и затем создаю массив читаемых человеком дат, над которыми я работаю. У меня есть массив из пяти объектов, и мне нужно отсортировать массив по указанным датам. Затем я пытаюсь использовать array_multisort и не могу найти синтаксис, который работает. Любая помощь будет оценена, и я уверен, что это что-то маленькое, что я пропускаю. Независимо от того, как сильно я в Google, я просто не могу правильно понять строку поиска. Помогите, пожалуйста?
<?php //This part I'm confident is working.
$json = file_get_contents("./data/posts.json");
$json_content = json_decode($json, true);
$date_sort = array ();
//Sorting the Array - this part seems to work
foreach ($json_content as $postObj) {
$post_date_human = date ('Y-m-d', $postObj['post_date']);
array_push($date_sort, $post_date_human);
}
print_r ($date_sort); //Seems to be working fine, now to try to sort one array of objects by the position of dates in the second array
// Wai u no werk!?
array_multisort($json_content, $date_sort = SORT_ASC);
print_r ($json_content);
2 ответа
РЕДАКТИРОВАТЬ: После прочтения комментариев, проверить другие темы, которые были полезны, как этот: сортировать многомерный массив по нескольким ключам и игнорировать документы PHP здесь: http://php.net/manual/en/function.array-multisort.php
Мой код работает, используя массив индексов, по которому array_multisort () сортирует массив FIRST. Опять же, первый аргумент, переданный array_multisort (), является SORTED BY, а не массивом, который вы хотите отсортировать. Это противоречит PHP документам, но, похоже, работает. Если вы обнаружите неправильную интерпретацию или ошибку в моем коде, почему он работает, пожалуйста, дайте мне знать. До тех пор, исправление для моего кода закончилось так:
array_multisort ($date_sort, SORT_DESC, $ json_content);
Кажется, что сортировка $date_sort происходит по убыванию, сначала размещая самые новые даты, а затем сортирует второй массив объектов по тому, как был отсортирован первый. Мне пришла в голову мысль о том, как программы, подобные Excel, будут сортировать таблицу по одному столбцу.
Спасибо, что нашли время, чтобы дать мне обратную связь и задать вопросы. Все это помогло в конечном итоге выяснить, что формулировка документов казалась противоположной (так как сортируемый массив сам по себе тоже сортируется (конечно), но это не намерение вызывать функцию, а другие массивы). которые сами отсортированы относительно первого массива).
Для справки см. Ниже код.
$json_content = msort($json_content, "post_date");
And heres the function itself:
/**
* Sort a 2 dimensional array based on 1 or more indexes.
*
* msort() can be used to sort a rowset like array on one or more
* headers (keys in the 2th array).
*
* @param array $array The array to sort.
* @param string|array $key The index(es) to sort the array on.
* @param int $sort_flags The optional parameter to modify the sorting
* behavior. This parameter does not work when
* supplying an array in the $key parameter.
*
* @return array The sorted array.
*/
function msort($array, $key, $sort_flags = SORT_REGULAR) {
if (is_array($array) && count($array) > 0) {
if (!empty($key)) {
$mapping = array();
foreach ($array as $k => $v) {
$sort_key = '';
if (!is_array($key)) {
$sort_key = $v[$key];
} else {
// @TODO This should be fixed, now it will be sorted as string
foreach ($key as $key_key) {
$sort_key .= $v[$key_key];
}
$sort_flags = SORT_STRING;
}
$mapping[$k] = $sort_key;
}
asort($mapping, $sort_flags);
$sorted = array();
foreach ($mapping as $k => $v) {
$sorted[] = $array[$k];
}
return $sorted;
}
}
return $array;
}
Для получения дополнительной информации посетите: https://blog.jachim.be/2009/09/php-msort-multidimensional-array-sort/comment-page-1/