排序数组,其中数组值与另一个数组的键匹配

时间:2012-12-14 12:36:41

标签: php arrays multidimensional-array

我有2个数组,1个保存要显示的数据,另一个保存顺序。

将在foreach循环中使用以下数组来显示:

array(
   [Posts] =>
            [0] =>
                 id => 7
                 content => 'some content'
            [1] =>
                 id => 3,
                 content => 'some other content'
            [2] =>
                 id => 4,
                 content => 'some more content'
            [3] =>
                 id => 2,
                 content => 'some irrelevant content'
)

此数组包含排序位置:

array(
   2, 4, 7, 3
)

我想基于关联数组中的vumulue对第一个数组进行排序,其中键是与第二个数组匹配的id。

预期产出:

array(
   [Posts] =>
            [0] =>
                 id => 2,
                 content => 'some irrelevant content'
            [1] =>
                 id => 4,
                 content => 'some more content'
            [2] =>
                 id => 7
                 content => 'some content'
            [3] =>
                 id => 3,
                 content => 'some other content'
)

2 个答案:

答案 0 :(得分:4)

如果源数组键等于Ids,你会非常自豪。这会加快速度。但是现在这会使您的源数据按照您的排序数组值进行排序:)

$res = array();
foreach( $sortArray as $sortId ) {
   foreach( $srcArray as $item ) {
      if( $item['id'] == $sortId ) {
         $res = $item;
         break;
      }
   }
}

修改

如果您将Id用作密钥,则第二个foreach()将毫无用处:

$res = array();
foreach( $sortArray as $sortId ) {
   $res[] = $srcArray[ $sortId ];
}

答案 1 :(得分:1)

此解决方案使用usort

$sarray = array(2, 4, 7, 3);
$sarray = array_flip($sarray);

usort($posts, function($a, $b) use($sarray) {
    // TODO: check if the array-index exists ;)
    $index_a = $sarray[$a['id']];
    $index_b = $sarray[$b['id']];

    return $index_a - $index_b;
});

var_dump($posts);

由于我正在使用闭包,你需要PHP 5.3才能使用它。如果您需要具有5.2兼容性,则可能必须使用create_function