在多个属性

时间:2017-01-24 22:14:29

标签: php arrays sorting object

我在这里遇到一些棘手的情况,我需要一些帮助。我在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个单值对对象数组进行排序。通过使用我已经尝试过的解决方案,这很容易并且完成,但我需要按键进行排序,而另一个键则要难得多。

2 个答案:

答案 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);