Как использовать 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/

Другие вопросы по тегам