【发布时间】:2017-06-09 22:41:57
【问题描述】:
我在这里遇到了一些棘手的情况,需要一些帮助。我在 PHP 中有一组对象,我需要对多个属性进行排序。最终目标是让它们在“停止”项目位于数组末尾的位置进行排序,然后整个数组由 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
)
...
)
我最初的想法是在 PHP 中使用内置的“usort”函数,但这并不顺利,因为它使 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 个单个值对对象数组进行排序。使用我已经尝试过的解决方案很容易做到这一点,但我需要按一个键和另一个键对它进行排序,这要困难得多。
【问题讨论】:
-
这可能很混乱,但您可以将数组拆分为两个单独的数组以供使用/停止使用,ksort() 它们,然后将它们组合在一起。这应该使您可以先按他们的键订购,然后再按他们的键订购。
-
您可以使用
array_filter()删除具有is_discontinued为true/1的索引,这样循环的其余部分就更容易了。然而,这意味着您暂时必须type juggle 对象。 -
@Jake 我可能不得不这样做。我试图避免将其拆分,然后将其重新组合在一起,因为我讨厌一个数组有 4 或 5 个 foreach 循环,但我没有看到另一种解决方案。我尝试过的所有东西都只能根据一个属性进行排序,而不是 2。
-
我已经编辑了“重复项”,以便更清楚地了解如何对多个倍数进行排序 - 您只需要扩展函数即可。我以 PHP 7 的飞船为例,但同样的逻辑也可以应用于 PHP 5 函数。