2015-10-14 36 views
1

我有兩個數組,一個是線性數組,表示將按照排序列出的排序列表,另一個是將要排序的關聯數組。如何根據PHP中的線性數組排序關聯數組?

在這裏,$recommended_props是排序列表和$prop_array是我想排序的聯想,根據排序列表。排序列表指示屬性代碼,並且我想根據此代碼索引對我的數組進行排序。

我的陣列

//Sorted list of property codes 
$recommended_props = [29822, 24785, 45875, 45872]; 

//Property details and this array will be sorted 
$prop_array = [ 
    [ 
     'code' => 24785, 
     'price' => 120, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 29822, 
     'price' => 150, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 45872, 
     'price' => 300, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 45875, 
     'price' => 250, 
     'currency' => 'USD', 
    ], 
]; 

而我所需的輸出是:

Array 
(
    [0] => Array 
     (
      [code] => 29822 
      [price] => 150 
      [currency] => USD 
     ) 

    [1] => Array 
     (
      [code] => 24785 
      [price] => 120 
      [currency] => USD 
     ) 

    [2] => Array 
     (
      [code] => 45875 
      [price] => 250 
      [currency] => USD 
     ) 

    [3] => Array 
     (
      [code] => 45872 
      [price] => 300 
      [currency] => USD 
     ) 

    ) 

我已經做了使用循環這個任務,但我的好奇心是要知道,有沒有什麼簡單的方法做這個工作?

我的代碼我用什麼:

$sorted_prop = []; 
foreach($recommended_props as $code){ 
    foreach($prop_array as $key=>$property){ 
     if($property['code'] == $code){ 
      $sorted_prop[] = $property; 
      unset($prop_array[$key]); 
      break; 
     } 
    } 
} 

任何建議將不勝感激。謝謝大家。

回答

1

usort()中的功能,使用方法:

$recommended_props = [29822, 24785, 45875, 45872]; 

$prop_array = [ 
    [ 
     'code' => 24785, 
     'price' => 120, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 29822, 
     'price' => 150, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 45872, 
     'price' => 300, 
     'currency' => 'USD', 
    ], 
    [ 
     'code' => 45875, 
     'price' => 250, 
     'currency' => 'USD', 
    ], 
]; 

usort(
    $prop_array, 
    function($a, $b) use ($recommended_props) { 
     return (array_search($a['code'], $recommended_props) < array_search($b['code'], $recommended_props)) ? -1 : 1; 

    } 
); 

var_dump($prop_array); 

你也許可以使它更有效率翻轉$recommended_props,和使用它通過回調中的密鑰訪問

+0

謝謝@Mark Ba​​ker。我期待着類似這個解決方案。 – MH2K9

0

usort是你需要的!

$recommended_props = [29822, 24785, 45875, 45872]; 

usort($prop_array, function($a, $b) use $recommended_props { 
    return strpos($recommended_props, $a['code']) > strpos($recommended_props, $b['code']); 
}); 

該代碼尚未經過測試,但它應該爲您提供一個關於如何繼續的好主意。 (請注意,您可能還需要處理的情況下代碼不是$ recommended_props陣列

+0

爲什麼你需要'cmp()'函數? –

+0

而'$ recommended_props'是一個數組 –