我一直在尝试编写递归函数,它会根据另一个数组(简单数字数组)提供的顺序重新排序对象数组。
我想使用这个排序功能通过'模板排序对象数组。只保存数组中每个对象的一个属性进行排序的数组,例如
$template = ['A', 'B', 'C']
要排序的数组:
$myArray = [
new Element('B'),
new Element('C'),
new Element('A'),
]
class Element
{
public $name;
public function __construct($name)
{
$this->name = $name;
}
}
我没有成功。也许您可能对如何评估此任务有所了解?
答案 0 :(得分:1)
我不知道递归会如何帮助你完成这项任务。这是您使用内置排序函数的方法:
usort($myArray, function(Element $a, Element $b) use ($template) {
return array_search($a->name, $template) - array_search($b->name, $template);
});
usort
按给定的比较回调排序Element
类型提示,因为sort函数只适用于Element
个对象的数组array_search
返回name
数组中给定$template
属性值的键。如果数组中不存在该值,则它将放在开头,因为结果false
被强制转换为0
。答案 1 :(得分:0)
我还设法使用递归进行排序 - 这里是:
function orderRecursively($template, $myArray, &$ordered)
{
foreach($myArray as $k => $v) {
if ($myArray[$k]->name == $template[0]) {
$ordered[] = $myArray[$k];
array_splice($template, 0, 1);
}
}
if (!empty($template)) orderRecursively($template, $myArray, $ordered);
}
$ordered = [];
order($template, $myArray, $ordered);
然后 $ordered
将保存已排序的对象数组。
不过,我发现@ fschmengler的答案更优雅。