排序php数组,以防它存在于其他数组中

时间:2014-01-11 19:41:52

标签: php arrays sorting

$a= [ '1' => ['key'=>'1','id'=>'4' ],
      '2' => ['key'=>'2','id'=>'1' ],
      '3' => ['key'=>'3','id'=>'5' ]
    ]

$b = [1,5]

所以我想对数组$a进行排序,这样如果$a[*]['id']位于$b数组中,它应该是第一个。

所以在这个例子中,输出应该是

$a = ['2' => ['key'=>'2','id'=>'1' ],
      '3' => ['key'=>'3','id'=>'5' ]
      '1' => ['key'=>'1','id'=>'4' ],
    ]

我试过

uasort($a, function($k, $v) use ($b) {
        return in_array($v['id'],$b) ? 1 : -1;
    });

但失败了:(

是否有使用任何php排序函数进行此类技巧的最佳方法?

2 个答案:

答案 0 :(得分:3)

uasort($a, function ($x, $y) use ($b) {
    return !in_array($x['id'], $b);
});

您必须注意,$y未使用且代码无法参考,但我更喜欢这种方式。

X和Y是任意两个数组值。如果sort函数返回1,则X放在最后(第一个Y,最后一个X)。如果返回-1,则X先行(第一个X,最后一个Y)。

在这种情况下,如果true不在$x[id]中,则排序函数将返回$b(相当于1),因此顺序将是Y,然后是X.这种排序将id中的所有数组值移至最后位置$b

说完之后,您也可以在没有$y的情况下使用此代码:

uasort($a, function ($x) use ($b) {
    return !in_array($x['id'], $b);
});

答案 1 :(得分:0)

这是另一种实现

$a= array( '1' => array('key'=>'1','id'=>'4' ), '2' => array('key'=>'2','id'=>'1' ), '3' => array('key'=>'3','id'=>'5' ) );
$b = array(1,5);
asort($a); 
function customuksort($t1, $t2) {
    global $a;

    return $a[$t1] < $a[$t2] ? -1 : 1;
}
uksort($b, 'customuksort');

print_r($a);

输出

Array ( [1] => Array ( [key] => 1 [id] => 4 ) [2] => Array ( [key] => 2 [id] => 1 ) [3] => Array ( [key] => 3 [id] => 5 ) )