2015-10-01 70 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的答案更加優雅。

    相關問題