在PHP中,根据另一个数组的值对数组进行排序

3

我有一个值如下的数组:

$Array1 = array("myfirst_value", "mysecond_value", "mythird_value"}

现在来看我的另一个数组,列表随机排列如下:-
$Array2 = array
(
    [4] => myfirst_value
    [8] => myforth_value
    [21] => mysecond_value
    [7] => myfifth_value
    [17] => mysixth_value
    [20] => mythird_value
    [16] => myseventh_value
)

我希望实现的目标是,根据$Array1中的值的顺序对$Array2进行排序。
因此,我希望$Array2被排序并变为:
$Array2 = array
(
        [4] => myfirst_value
        [21] => mysecond_value
        [20] => mythird_value


        [7] => myfifth_value
        [8] => myforth_value
        [16] => myseventh_value
        [17] => mysixth_value

)

请注意,Array1的值首先进行排序,其余的值只是按照原样输出,没有任何顺序。

谢谢


3
按照 http://php.net/manual/en/function.uasort.php 进行排序。 - venca
你尝试过什么吗? - Rizier123
3个回答

1
如果我理解正确的话
$Array1 = array("myfirst_value", "mysecond_value", "mythird_value");

$Array2 = array
(
    4 => myfirst_value,
    8 => myforth_value,
    21 => mysecond_value,
    7 => myfifth_value,
    17 => mysixth_value,
    20 => mythird_value,
    16 => myseventh_value
);

// Remove elements of the 1st array from the 2nd
function f ($v) { global $Array1;  return in_array($v, $Array1);}
$a1 = array_filter($Array2, 'f');    
// Take the rest elements
$a2 = array_diff_key($Array2, $a1);
// Combine back 
print_r($a1+$a2);

结果
Array
(
    [4] => myfirst_value
    [21] => mysecond_value
    [20] => mythird_value
    [8] => myforth_value
    [7] => myfifth_value
    [17] => mysixth_value
    [16] => myseventh_value
)

非常感谢您抽出时间来做这件事。不幸的是,这给了我一个白屏。我猜我的 PHP 版本不支持它。 - Steve
你使用的是哪个版本? - splash58
@Steve 现在试试吧 - 我删除了匿名函数 - splash58
非常感谢Splash。不幸的是,它现在什么也没做。$a1基本上是空的。 - Steve
https://eval.in/380070 在那里可以工作。我稍后再看看,在你的版本中还有什么可能不起作用。 - splash58

1

您也可以使用uasort()函数

uasort($Array2, function($a,$b) use (&$Array1){
    foreach($Array1 as $key => $value){
        if($a == $value){
            return 0;
            break;
        }
        if($b == $value){
            return 1;
            break;
        }
    }
    if($a == $b){ return 0;}  return ($a < $b) ? -1 : 1;
});

小提琴


0

除了splash的完美答案,这个也可以:

 $Sorted_Array = array_merge(
        array_intersect($Array1, $Array2), 
        array_diff($Array2, $Array1)
 );

array_intersect($Array1, $Array2) - 会丢失键值,这不是正确的答案 :) - splash58
现在,当然我甚至无法与你的答案比较 :) - Steve
我很认真 - 函数的结果将具有键0,1,2...但您希望将它们保存在源数组中。 - splash58

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接