示例:
$a = [ 'b', 'd', 'a', 'e' ]
$b = [ 'e', 'a', 'q', 'b' ]
我想要
$b = [ 'b', 'a', 'e', 'q']
我需要对$b
进行排序,以使$a
中的每个元素按照$a
中元素的相同顺序排列。
所以'b'
,'a'
和'e'
位于$a
,所以他们先来,然后新的'q'
是最后的。
我问的是一个我不知道的函数,如果存在,或者是一种技术。
答案 0 :(得分:2)
只要每个数组都有不同的值并且没有字符串键,这就应该有效。
$b = array_merge(array_intersect($a, $b), array_diff($b, $a));
这确实依赖于array_diff
的无证件行为。
答案 1 :(得分:0)
如果您需要一段非常冗长,繁琐的代码,与 Don's panic 非常有创意的oneliner完全相同,您可以使用我的代码。 ; - )
这个的优点是它不依赖于array_diff
等函数的(大多数未记录的)实现细节。此外,它给你一个很好的机会使用一个封闭,除了非常酷,没有特别的优势。代码可能会更短一点,但这个逐步解决方案至少应该相对容易理解。
<?php
$a = [ 'b', 'd', 'a', 'e', 'x' ];
$b = [ 'e', 'a', 'q', 'b', 'g' ];
// Custom sorter functions like usort use a callback that compares items.
// The compare function should return < 0 if the first item should come
// before the second, > 0 if the second item should come first, or 0
// if both items can be considered equal.
$sortFunction = function($i1, $i2) use ($a, $b)
{
// Get the indexes of both item in array $a
$x1 = array_search($i1, $a);
$x2 = array_search($i2, $a);
// If both indexes are assigned, compare them.
if ($x1 !== false && $x2 !== false)
return $x1 - $x2;
// Only the first item exists, so that one is 'smaller' (should come before the other)
if ($x1 !== false)
return -1;
// Only the second item exists, so that one is 'smaller'
if ($x2 !== false)
return 1;
// Neither exist. Keep the original order as they were in $b.
return array_search($i1, $b) - array_search($i2, $b);
};
$c = $b;
usort($c, $sortFunction);