PHP:按另一个键值数组的值对键值数组进行排序

时间:2016-11-18 10:54:15

标签: php arrays sorting

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

$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)的排序,但我认为我的问题不同。

1 个答案:

答案 0 :(得分:1)

不确定。由于您希望通过数组键的自定义函数进行排序,因此相应的工具将为uksort。您可以直接在$orderByCount比较器中使用它:

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

uksort($labelArray, $orderByCount);

但有两点与您的问题没有直接关系:

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