PHP:对具有非常量键数的多维数组进行排序
在PHP中,我有这样一种数组(很抱歉,这是一个大示例),但它是一种特定的排序:PHP:对具有非常量键数的多维数组进行排序,php,sorting,multidimensional-array,Php,Sorting,Multidimensional Array,在PHP中,我有这样一种数组(很抱歉,这是一个大示例),但它是一种特定的排序: [0] => Array ( [title] => 1 [desc] => 2 ) [1] => Array ( [title] => 1 [desc] => 3 ) [2] => Array ( [title] => 1 [desc]
[0] => Array
(
[title] => 1
[desc] => 2
)
[1] => Array
(
[title] => 1
[desc] => 3
)
[2] => Array
(
[title] => 1
[desc] => 2
[content] => 10
)
[3] => Array
(
[title] => 1
[desc] => 2
[content] => 11
)
[4] => Array
(
[title] => 1
[desc] => 3
[content] => 9
)
[5] => Array
(
[title] => 1
[desc] => 2
[content] => 10
[tag] => 'foo'
)
[6] => Array
(
[title] => 1
[desc] => 2
[content] => 10
[tag] => 'bar'
)
我想要这个输出:
[0] => Array
(
[title] => 1
[desc] => 2
)
[1] => Array
(
[title] => 1
[desc] => 2
[content] => 10
)
[2] => Array
(
[title] => 1
[desc] => 2
[content] => 10
[tag] => 'bar'
)
[3] => Array
(
[title] => 1
[desc] => 2
[content] => 10
[tag] => 'foo'
)
[4] => Array
(
[title] => 1
[desc] => 2
[content] => 11
)
[5] => Array
(
[title] => 1
[desc] => 3
)
[6] => Array
(
[title] => 1
[desc] => 3
[content] => 9
)
不幸的是,array_multisort无法对具有非常量键数的数组进行排序:它只是忽略了all数组。。。
有什么想法吗?我不清楚您要按什么标准排序,但您可以使用,您可以为它提供一个定义比较的函数。我不清楚您要按什么标准排序,但您可以使用,您为它提供了一个定义比较的函数。您可以将usort与定制的cmp函数一起使用,以满足您的特殊需要,如以下代码:
usort($arr, "cmp");
function cmp($a, $b) {
$array = array('title','desc','content','tag');
foreach ($array as &$ar) {
$ai = isset($a[$ar]);
$bi = isset($b[$ar]);
if ($ai && !$bi) {
return 1;
}
if ($bi && !$ai) {
return -1;
}
if (!$bi) {
return 0;
}
if ($a[$ar] > $b[$ar]) {
return 1;
}
if ($b[$ar] > $a[$ar]) {
return -1;
}
}
return 0;
}
这应该可以满足您的需要。您可以将usort与定制的cmp功能结合使用,以满足您的特殊需要,如以下代码:
usort($arr, "cmp");
function cmp($a, $b) {
$array = array('title','desc','content','tag');
foreach ($array as &$ar) {
$ai = isset($a[$ar]);
$bi = isset($b[$ar]);
if ($ai && !$bi) {
return 1;
}
if ($bi && !$ai) {
return -1;
}
if (!$bi) {
return 0;
}
if ($a[$ar] > $b[$ar]) {
return 1;
}
if ($b[$ar] > $a[$ar]) {
return -1;
}
}
return 0;
}
这应该可以满足您的需要。以下是示例代码的排序:
function cmp ($a, $b) {
if ($a['desc'] == $b['desc']) {
if (!isset($a['content']) && !isset($b['content'])) {
return 0;
}
else if (!isset($a['content'])) {
return -1;
}
else if (!isset($b['content'])) {
return 1;
}
else {
if ($a['content'] == $b['content']) {
if (!isset($a['tag'])) {
return -1;
}
else if (!isset($b['tag'])) {
return 1;
}
else {
if ($a['tag'] == $b['tag']) {
return 0;
}
else if ($a['tag'] < $b['tag']) {
return -1;
}
else {
return 1;
}
}
return 0;
}
else if ($a['content'] < $b['content']) {
return -1;
}
else {
return 1;
}
}
return 0;
}
else if ($a['desc'] < $b['desc']) {
return -1;
}
else {
return 1;
}
}
usort($array, 'cmp');
感谢@Nelson、@therefromhere和@xdazz让我加入usort:以下是示例代码的排序:
function cmp ($a, $b) {
if ($a['desc'] == $b['desc']) {
if (!isset($a['content']) && !isset($b['content'])) {
return 0;
}
else if (!isset($a['content'])) {
return -1;
}
else if (!isset($b['content'])) {
return 1;
}
else {
if ($a['content'] == $b['content']) {
if (!isset($a['tag'])) {
return -1;
}
else if (!isset($b['tag'])) {
return 1;
}
else {
if ($a['tag'] == $b['tag']) {
return 0;
}
else if ($a['tag'] < $b['tag']) {
return -1;
}
else {
return 1;
}
}
return 0;
}
else if ($a['content'] < $b['content']) {
return -1;
}
else {
return 1;
}
}
return 0;
}
else if ($a['desc'] < $b['desc']) {
return -1;
}
else {
return 1;
}
}
usort($array, 'cmp');
感谢@Nelson、@therefromhere和@xdazz让我进入usort:事实上,排序是每个键上的一个循环,以数字顺序排列。我想我可以用很多循环来重建数组?事实上,排序是每个键上的一个循环,以数字顺序排列。我想我可以用很多循环来重建阵列?这也正是我刚才所做的!完美:我很高兴你能用它,我的代码看起来更简洁,更易读,所以你可能想把它当作一个可供选择的比较方法。记住对任何你认为有用的答案投赞成票,接受任何你想要的答案也可能是你的答案。这正是我刚才在我这边所做的!完美:我很高兴你能用它,我的代码看起来更简洁,更易读,所以你可能想把它当作一个可供选择的比较方法。记住对任何你认为有用的答案投赞成票,接受任何你想要的答案也可能是你的答案。