2015-10-14 37 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'是一个数组 –