[英]How to sort an array of associative arrays by value of a given key in PHP?
[英]How to sort an array of associative arrays by value of a key in PHP
很难解释,所以这里有一个例子:
$strings = array(
array("languageCode" => "ES", "string" => "hola"),
array("languageCode" => "EN", "string" => "hello"),
array("languageCode" => "IT", "string" => "ciao"),
array("languageCode" => "CHS", "string" => "您好"),
);
我想通过定义顺序按languageCode
值对字符串排序:
function magicStringOrder(array $strings, array $languageCodeOrder){
// ....
return $strings;
}
$strings = magicStringOrder($strings, array('EN', 'IT') );
$strings = array(
array("languageCode" => "EN", "string" => "hello"),
array("languageCode" => "IT", "string" => "ciao"),
array("languageCode" => "ES", "string" => "hola"),
array("languageCode" => "CHS", "string" => "您好"),
);
有magicStringOrder
吗?
我现在知道,用几个循环来解决是一个简单的问题。 我需要一个非常快速的函数(它多次调用,具有大数组)
没有php sort函数的另一个想法:
// sort by cmp $arr[$magic_key] <-> arr $magic_order
function magicSort($arr, $magic_key="", $magic_order = array())
{
$sorted = array();
foreach($magic_order AS $v) {
foreach($arr AS $k2 => $v2) {
if($v===$v2[$magic_key]) {
$sorted[] = $v2;
unset($arr[$k2]);
}
}
}
// attach what's left
return array_merge($sorted, $arr);
}
在eval.in进行测试 ( 链接即将过期 )
$strings = array(
array("languageCode" => "ES", "string" => "hola"),
array("languageCode" => "EN", "string" => "hello"),
array("languageCode" => "IT", "string" => "ciao"),
array("languageCode" => "CHS", "string" => "??"),
);
print_r(magicSort($strings, "languageCode", array("EN", "IT")));
输出到 :
Array
(
[0] => Array
(
[languageCode] => EN
[string] => hello
)
[1] => Array
(
[languageCode] => IT
[string] => ciao
)
[2] => Array
(
[languageCode] => ES
[string] => hola
)
[3] => Array
(
[languageCode] => CHS
[string] => 您好
)
)
$magic_order
也可以为空。 如果是这样,则仅重新索引该数组。 具有$magic_order
中不存在的值的数组将下移并保持其顺序。
不确定是否正是您所需要的。
如果对一种语言进行权衡不是问题,排序将变得更加容易,因此更加快捷。
您可以使用asort
根据$languageCodeOrder
存储的权重对数组进行排序。 如果$languageCodeOrder
不存在某种语言,则其权重将变为0,并接近有序数组的末尾。
阵列的最终顺序是从高重量到低重量。 也就是说:如果EN的权重为1,它将在IT的权重为2之后出现在数组中。
$strings = array(
array("languageCode" => "ES", "string" => "hola"),
array("languageCode" => "EN", "string" => "hello"),
array("languageCode" => "IT", "string" => "ciao"),
array("languageCode" => "CHS", "string" => "您好"),
);
function magicStringOrder(array $strings, array $languageCodeOrder) {
uasort($strings, function($a,$b) use ($languageCodeOrder) {
$val_a = (isset($languageCodeOrder[$a["languageCode"]])) ? $languageCodeOrder[$a["languageCode"]] : 0;
$val_b = (isset($languageCodeOrder[$b["languageCode"]])) ? $languageCodeOrder[$b["languageCode"]] : 0;
return $val_b - $val_a;
});
return $strings;
}
$strings_ordered = magicStringOrder($strings, array('EN' => 1, 'IT' => 2, 'ES' => 3, 'CHS' => 4));
print_r($strings_ordered);
如果数组很大,最好依靠PHP排序算法,而不是尝试实现自定义算法。
随意修改算法中的任何内容(顺序或其他)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.