如何通过一个键的值在PHP排序关联数组的数组
很难如此解释这里是一个例子:如何通过一个键的值在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 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);
}
Test it at 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
中的值的数组向下移动,并保持其顺序。
不确定,如果这正是你需要的。
是一个好主意! – 2015-02-08 12:44:43
基准测试后这个更快 – 2015-02-08 12:58:56
它工作起来很简单,很高兴你喜欢它@SimoneNigro :) – 2015-02-08 13:00:16
如果这不是一个给语言加权的问题,排序变得更容易,因此更快。您可以使用asort
根据存储的权重对数组进行排序。如果一种语言不在$languageCodeOrder
中,则它的权重将变为0并且趋向有序数组的末尾。
数组的最终顺序将从高权重到低权重。那就是:如果EN为1的权重将出现后,它在阵列中有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排序算法,而不是试图实现自定义的。
随意修改算法中的任何内容(顺序或其他)。
功能几乎就像我会(看我的编辑)。但是,我宁愿语言不在订单中,保持其位置。如果可能的话,根据新的头寸(0,1,2)和(1,2,4)重新计算指数会更好。非常感谢 – 2015-02-08 12:09:18
请原谅,删除我的编辑,这是错误的 – 2015-02-08 12:19:27
@SimoneNigro无后顾之忧,很高兴它帮助,祝你好运:) – acontell 2015-02-08 12:33:09
对于在您的语言编码器中没有条目的值,您有什么期望? – 2015-02-08 11:26:26
@MarkBaker如果定义的顺序是假定的位置,否则保持其位置 – 2015-02-08 11:34:46