对数组中的元素进行排序,以便具有一些任意定义的id的元素排在第一位

时间:2016-06-17 14:24:45

标签: php arrays sorting

我有一个包含一些元素的数组,每个元素都有一个名称和一个id。例如:

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => a
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => b
        )

    [2] => stdClass Object
        (
            [id] => 3
            [name] => c
        )

    [3] => stdClass Object
        (
            [id] => 4
            [name] => d
        )

    [4] => stdClass Object
        (
            [id] => 5
            [name] => e
        )

)

我想用它们做什么,是允许在另一个数组中定义一些首选元素,然后对这个元素进行排序,以便那些"首选"那些将首先出现。

例如,在这里,如果我的用户现在说他更喜欢ID为4,5和6的项目,那么这些项目的顺序应该会导致:

Array
(
    [0] => stdClass Object
        (
            [id] => 4
            [name] => d
        )

    [1] => stdClass Object
        (
            [id] => 5
            [name] => e
        )

    [2] => stdClass Object
        (
            [id] => 1
            [name] => a
        )

    [3] => stdClass Object
        (
            [id] => 2
            [name] => b
        )

    [4] => stdClass Object
        (
            [id] => 3
            [name] => c
        )

)

4和5现在首先出现,因为它们是首选,6实际上不存在的事实没有区别(它只是首选,不是强制性的),然后其余的列出一个无关紧要的订单。

现在,静态地说,我知道我可以通过这样做来实现这个确切的行为:

usort($elements, function($a, $b) { return in_array($a->id, [4,5,6]) ? -1 : 1; });

这是有效的,它会将ID为4和5的元素排在最前面。但是如果我希望那些[4,5,6]在变量中,因为它们来自另一个来源(它们不是静态的),那么我就无法完成这项工作......在数组中定义它们调用$preferred然后在函数调用中使用global $preferred会导致$preferred的值为NULL

这看起来很奇怪,因为这似乎是一件明智的事情。

那么我的替代方案是什么呢?

2 个答案:

答案 0 :(得分:1)

由于您在尝试使用global时没有显示您的代码,因此我无法解释那里出现的问题。

无论如何,正如@Marc B已经建议的那样,建议的方法是使用use而不是global

这样一个简单的功能可以实现您的计划:

function move_top($preferred, $elements) {
  usort($elements, function($a, $b) use ($preferred) {
    return in_array($a->id, $preferred) ? -1 : 1;
  });
  print_r($elements);
}
move_top([4,5,6], $elements);

答案 1 :(得分:0)

阅读本文.. http://php.net/manual/en/function.usort.php ..希望它有所帮助..

另一个类似的线程Sorting a php array of arrays by custom order