我有一个包含一些元素的数组,每个元素都有一个名称和一个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
。
这看起来很奇怪,因为这似乎是一件明智的事情。
那么我的替代方案是什么呢?
答案 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 ..希望它有所帮助..