2016-01-13 54 views
1

使用CakePHP 2.7,我的發現結果的數組:CakePHP的 - 排序結果陣列單獨

array(
    (int) 0 => array(
     'Foo' => array(
      'id' => '786', 
      'bar_id' => '12', 
      // more data 
     ), 
     'Bar' => array(
      'id' => '12', 
      // more data 
     ) 
    ), 
    (int) 1 => array(
     'Foo' => array(
      'id' => '785', 
      'bar_id' => '13', 
      // more data 
     ), 
     'Bar' => array(
      'id' => '13', 
      // more data 
     ) 
    ), 
    // many more results 

現在我想確實有它的「bar_id」的定義個人方式排序,不是數字。排序順序在另一個數組描述:

array(9, 3, 18, 36, …) 

有沒有更好的辦法把它做的,但在循環遍歷排序陣列,挑電流id然後將結果陣列上的循環(循環內的循環)看那裏的相應'bar_id',如果發現寫結果到一個新的結果數組?

$results = array(…); // the results 
$order = array(9, 3, 18, 36, …); 
$sortedResults = array(); 
foreach ($order as $barId) { 
    foreach ($results as $result) { 
     if ($barId == $result['Foo']['bar_id']) { 
      $sortedResults[] = $result; 
      break; 
     } 
    } 
} 

我知道蛋糕有哈希實用程序(原名「設置」)與陣列的工作,但我不能找到一種方法用了這樣做。

回答

1

我會做這樣的:

$indexed_results = Hash::combine($results , '{n}.Foo.bar_id', '{n}'); 

foreach($order as $index) 
{ 
    $sortedResults[] = $indexed_results[$index]; 
} 

第一行替換的bar_id的corrispondant值$results索引,所以你可以做一個單循環

編輯:可能是你必須檢查$index實際上是否存在於您的陣列中,除非您確定$order中的每個值都有對應的bar_id否則您會收到「未定義索引」通知

+0

謝謝,arilia。它工作得很好!對不起,我的名聲不夠高,無法投票回答你的答案。 – Christian