我有两个字符串数组:一个有序数组 - 数组X和一个无序数组 - 数组Y
新数组应具有的内容:所有项目应仅来自数组Y,并且应根据X中的顺序对X和Y之间重叠的项目进行排序,然后其余项目(如果有的话)应该位于结尾的顺序与原来在Y中的顺序相同.X可能包含不在Y中的条目,我们只想忽略它们。
这样做的有效方法是什么(在php中)?
示例:
数组X:{'a','z','q','d'}
数组Y:{'b','c','a','d','z'}
结果:{'a','z','d','b','c'}
所以我的想法是:我们想要获取第二个数组(数组Y),并根据数组X中给出的顺序对其中的元素进行排序。由于数组Y可能有更多的额外元素,我们只想将这些额外的元素放在这个新结果数组的末尾。有意义吗?
答案 0 :(得分:3)
$r = array_merge(array_intersect($x, $y), array_diff($y, $x))
答案 1 :(得分:1)
你可以这样做:
$result = array();
// build index array for constant lookup
$indexY = array_flip($y);
// test for each value in X whether it is in Y
foreach ($x as $valueX) {
if (isset($indexY[$valueX])) {
$result[] = $valueX;
// remove it from the index so we know which values remain
unset($indexY[$valueX]);
}
}
// append remaining values
foreach ($indexY as $valueY => $i) {
$result[] = $valueY;
}
更新这绝对不是最简洁的解决方案,但其运行时复杂度为Ο( n ),与此处提到的其他{{3}相反},array_intersect
和array_diff
在内部对数组进行排序,每个数组都在Ο( n ·log n )中。
答案 2 :(得分:1)
<?php
$intersect = array_intersect($x, $y);
$diff = array_diff($y, $x);
$result = array_merge($intersect, $diff);
?>