我在这里遇到一些棘手的情况,我需要一些帮助。我在PHP中有一个对象数组,我需要在多个属性上对它们进行排序。最终目标是将它们排序在哪里"停止" items位于数组的末尾,然后整个数组由ID完成。所以ID 1将在2之前出现,除非1停止,然后2将首先出现。以下是我的数据示例......
$prod = array(
1 => Product Object (
[id] => 1
[title] => "A product"
[is_discontinued] => 1
)
2 => Product Object (
[id] => 2
[title] => 'Another Product'
[is_discontinued] => 0
)
3 => Product Object (
[id] => 3
[title] => 'Yet another one'
[is_discontinued] => 0
)
...
)
我最初的想法是使用内置的" usort"在PHP中运行,但是它并没有顺利进行,因此它的ID是向后的。这就是我做的..
$prod = usort($prod, function($a) {
return ($a->is_discontinued) ? 1 : -1;
});
有效,所有已停产的产品现在都在数组的末尾,但它颠倒了ID的顺序,所以现在首先列出3,然后是2,然后是1.我需要它,所以它会被列出然后是2,然后是3,然后是1.因为2是非停止的最低ID,然后是3,最后是1,因为它是已停止的ID中的最低者。
我希望我有意义,如果需要,我非常乐意提供更多代码,我真的需要弄明白这一点。非常感谢您提供任何帮助,非常感谢。
我的问题被标记为重复的问题没有帮助,因为问题是基于1个单值对对象数组进行排序。通过使用我已经尝试过的解决方案,这很容易并且完成,但我需要按键进行排序,而另一个键则要难得多。
答案 0 :(得分:3)
你仍然可以使用usort:)
<?php
$array = [
(object) ['id' => 1, 'title' => 'A product', 'is_discontinued' => 1],
(object) ['id' => 4, 'title' => 'C product', 'is_discontinued' => 0],
(object) ['id' => 3, 'title' => 'B product', 'is_discontinued' => 1],
(object) ['id' => 2, 'title' => 'X product', 'is_discontinued' => 0],
(object) ['id' => 5, 'title' => 'W product', 'is_discontinued' => 0]
];
print_r($array);
$prod = usort($array, function($a, $b) {
$c = $a->is_discontinued - $b->is_discontinued;
$c .= $a->id - $b->id;
return $c;
});
print_r($array);
工作示例: http://sandbox.onlinephpfunctions.com/code/549f1d5a1afcf983ad34303b80af0968927a62df
答案 1 :(得分:1)
您可以过滤两个数组并合并它们
$prod = array(
1 => array (
'id' => 1,
'title' => "A product",
'is_discontinued' => 1,
),
2 => array (
'id' => 2,
'title' => 'Another Product',
'is_discontinued' => 0,
),
3 => array (
'id' => 3,
'title' => 'Yet another one',
'is_discontinued' => 0
)
);
$discontinued = array_filter($prod, function($elem) {
return $elem['is_discontinued'] ==1;
});
$continued = array_filter($prod, function($elem) {
return $elem['is_discontinued'] ==0;
});
echo "<pre>";
$new_array=array_merge($continued,$discontinued);
print_r($new_array);