在多个属性上对PHP中的一组对象进行排序[重复]
Posted
技术标签:
【中文标题】在多个属性上对PHP中的一组对象进行排序[重复]【英文标题】:sorting an array of objects in PHP on more than one property [duplicate] 【发布时间】: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 函数。
【参考方案1】:
你仍然可以使用 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
【讨论】:
【参考方案2】:你可以过滤两个数组并合并它们
$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);
【讨论】:
这似乎成功了,而且在服务器上也不会太难。我主要担心的是,我正在处理一个包含 650 多个对象的数组,并且我不想太用力地推动处理并使页面滞后,但是这种方法似乎不需要太多开销就可以做到。谢谢。 我错过了类型杂耍。否则使用property_exists()
以上是关于在多个属性上对PHP中的一组对象进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章
带有NSFetchedResultsController的UICollectionViewController损坏了,当所有对象的update属性,如果控制器对此属性进行了排序
如何使用Comparable Interface比较ArrayList中对象的多个属性? [重复]