用于对对象数组进行排序的递归函数

时间:2015-10-01 21:03:31

标签: php arrays sorting recursion

我一直在尝试编写递归函数,它会根据另一个数组(简单数字数组)提供的顺序重新排序对象数组。

我想使用这个排序功能通过'模板排序对象数组。只保存数组中每个对象的一个​​属性进行排序的数组,例如

$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;
    }
}

我没有成功。也许您可能对如何评估此任务有所了解?

2 个答案:

答案 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的答案更优雅。