2015-10-01 72 views
-1

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

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

$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

看看这里:http://stackoverflow.com/questions/4501340/order-multidimensional-array-recursively-at-each-level-in-php我认为它是类似于你的问题 –

+0

是否有原因它必须是一个递归函数,为什么你不能使用任何PHP的排序功能? – georaldc

+0

@georaldc,是的,我想调整这个函数来根据模板数组来排序一个对象数组,模板数组只能保存存储在数组中的对象的一个​​属性进行排序。我会编辑我的问题来说清楚。 – luqo33

回答

1

我不明白递归会如何帮助您完成该任务。这是你如何可以使用内置的排序功能:通过给定的比较回调

  • 我加入了Element类型暗示回调

    usort($myArray, function(Element $a, Element $b) use ($template) { 
        return array_search($a->name, $template) - array_search($b->name, $template); 
    }); 
    
    • usort排序,因为排序功能将只与Element阵列工作对象
    • array_search返回$template阵列中给定的name属性值的密钥。如果该值不存在于数组中,它将被放置在开始处,因为结果false被强制为0
  • +0

    这是一个很好的,紧凑的方式来做到这一点。真的,为什么它必须是递归函数没有什么特别的理由。 – luqo33

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

    相关问题