【问题标题】:Sort an array based on another array's values in PHP在 PHP 中根据另一个数组的值对数组进行排序
【发布时间】:2015-06-12 13:44:37
【问题描述】:

我有一个数组,其值如下:-

$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
)

我希望实现的是 $Array2 根据 $Array1 中值的顺序进行排序。

所以,我希望 $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 的值先排序,其余的只是输出,没有任何顺序。

谢谢

【问题讨论】:

标签: php arrays sorting


【解决方案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 现在试试 - 我删除了匿名函数
  • 非常感谢飞溅。不幸的是,它现在什么也没做。 $a1 基本上是空的
  • eval.in/380070 它可以工作。我稍后再看,还有什么可能在您的版本中不起作用
【解决方案2】:

你也可以使用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;
});

Fiddle

【讨论】:

    【解决方案3】:

    除了飞溅的完美答案之外,这也有效:-

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

    【讨论】:

    • array_intersect($Array1, $Array2) - 丢失密钥。这是错误的答案:)
    • :-D ...当然,我什至无法与您的答案进行比较:)
    • 我是认真的 - 函数的结果将有键 0,1,2...但是你想从源数组中保存它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-08-05
    • 1970-01-01
    • 2015-04-17
    • 2011-02-11
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多