【问题标题】:PHP: Sort key-value array by value of another key-value array [duplicate]PHP:按另一个键值数组的值对键值数组进行排序[重复]
【发布时间】:2017-04-02 04:45:36
【问题描述】:

我有两个键值数组。两个数组中的键是相同的,但是在第一个数组中它们指向一个字符串标签,而在第二个数组中它们指向一个整数:

$labelArray (size=n)
 ID_1 => LABEL_1 
 ID_2 => LABEL_2
 ...up to n items

$countArray (size=n)
 ID_1 => Count_1
 ID_2 => Count_1
 ...up to n items

我喜欢按 countArray 的值对 labelArray 进行排序。到目前为止,我只提出了一个非常复杂的解决方案,我分别对键进行排序,然后像这样创建一个新数组:

// my current (very convoluted solution) 
$keys = array_keys($labelArray);
$orderByCount = function($a, $b)  use ($countArray ) {
 return $countArray [$b] - $countArray [$a];
}; 
usort($keys, $orderByCount);
$labelArrayNewOrder = array();
foreach ($keys as $key) {  
 $labelArrayNewOrder[$key] = $labelArray[$key];
}

有什么解决方案可以让我不必创建新数组,只需对现有的 labelArray 重新排序?

这应该是一个常见的问题,但我在网上找不到解决方案。只有指向多维数组排序的指针 (How do I Sort a Multidimensional Array in PHP) 但我认为我的问题不同。

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    当然。由于您想通过数组键的自定义函数进行排序,因此合适的工具是uksort。您可以直接将其与 $orderByCount 比较器一起使用:

    $orderByCount = function($a, $b)  use ($countArray ) {
         return $countArray [$b] - $countArray [$a];
    };
    
    uksort($labelArray, $orderByCount);
    

    与您的问题没有直接关系的两点注意事项:

    1. 如果您使用比较功能中的return $x - $y 快​​捷方式,请务必小心!结果在被解释之前被转换成一个整数,这意味着如果所涉及的值是浮点数,你可能会得到错误的排序结果。在这种情况下,“计数”意味着这些值确实是整数并且不会出现任何问题,但需要牢记这一点。
    2. 您的比较函数给出了降序排序,这不是很明显。或许可以通过将比较器命名为$orderByCountDesc 来帮助代码的未来读者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多