【问题标题】:Recursive function to sort an array of objects递归函数对对象数组进行排序
【发布时间】:2015-12-30 01:17:31
【问题描述】:

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

我想使用此排序函数通过“模板”数组对对象数组进行排序,该数组将仅保存数组中要排序的每个对象的一个​​属性,例如

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

我没有成功。也许您可能对如何完成这项任务有一个想法?

【问题讨论】:

  • 看这里:*.com/questions/4501340/…我觉得和你的问题差不多
  • 它必须是递归函数以及为什么不能使用 PHP 的任何排序函数有什么原因吗?
  • @georaldc,是的,我想调整此函数以根据模板数组对对象数组进行排序,其中模板数组将仅包含存储在数组中要排序的对象的一个​​属性。我将编辑我的问题以使其清楚。

标签: php arrays sorting recursion


【解决方案1】:

我看不出递归如何帮助您完成这项任务。这是您可以使用内置排序功能的方式:

usort($myArray, function(Element $a, Element $b) use ($template) {
    return array_search($a->name, $template) - array_search($b->name, $template);
});
  • usort 按给定的比较回调排序
  • 我在回调中添加了Element 类型提示,因为排序函数仅适用于Element 对象的数组
  • array_search 返回$template 数组中给定name 属性值的键。如果数组中不存在该值,则将其放在开头,因为结果false被强制转换为0

【讨论】:

  • 这是一个很棒的、紧凑的方法。确实,它必须是递归函数并没有什么特别的原因。
【解决方案2】:

我还设法使用递归进行排序 - 这里是:

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

【讨论】: