如何使用 array_multisort() 对 PHP 中的对象数组进行排序?
How do I use array_multisort() to sort an array of objects in 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);
参考下面的代码。
$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/
编辑:阅读评论后,查看其他有价值的线程:Sort multidimensional array by multiple keys and ignoring the PHP docs here: http://php.net/manual/en/function.array-multisort.php
我通过使用索引数组使我的代码工作,array_multisort () 排序是提供的第一个数组。同样,传递给 array_multisort() 的第一个参数是 SORTED BY 而不是您要排序的数组。这与 PHP 文档相反,但似乎有效。如果您在我的代码中发现对其工作原因的误解或错误,请告诉我。在那之前,我的代码的修复最终是这样的:
array_multisort($date_sort, SORT_DESC, $json_content);
它似乎按降序对 $date_sort 进行排序,将最新日期放在首位,然后按照第一个对象的排序方式对第二个对象数组进行排序。我想到像 Excel 这样的程序如何根据单个列对 table 进行排序。
感谢您花时间给我反馈和提问。所有这些都有助于最终弄清楚文档的措辞似乎是相反的(因为排序依据的数组本身也是排序的(当然),但这不是调用函数的意图,而是其他数组它们本身是相对于第一个数组排序的)。
我正在努力让 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);
参考下面的代码。
$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/
编辑:阅读评论后,查看其他有价值的线程:Sort multidimensional array by multiple keys and ignoring the PHP docs here: http://php.net/manual/en/function.array-multisort.php
我通过使用索引数组使我的代码工作,array_multisort () 排序是提供的第一个数组。同样,传递给 array_multisort() 的第一个参数是 SORTED BY 而不是您要排序的数组。这与 PHP 文档相反,但似乎有效。如果您在我的代码中发现对其工作原因的误解或错误,请告诉我。在那之前,我的代码的修复最终是这样的:
array_multisort($date_sort, SORT_DESC, $json_content);
它似乎按降序对 $date_sort 进行排序,将最新日期放在首位,然后按照第一个对象的排序方式对第二个对象数组进行排序。我想到像 Excel 这样的程序如何根据单个列对 table 进行排序。
感谢您花时间给我反馈和提问。所有这些都有助于最终弄清楚文档的措辞似乎是相反的(因为排序依据的数组本身也是排序的(当然),但这不是调用函数的意图,而是其他数组它们本身是相对于第一个数组排序的)。