Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中按键的值对关联数组进行排序_Php_Arrays - Fatal编程技术网

如何在PHP中按键的值对关联数组进行排序

如何在PHP中按键的值对关联数组进行排序,php,arrays,Php,Arrays,很难解释,下面是一个例子: $strings = array( array("languageCode" => "ES", "string" => "hola"), array("languageCode" => "EN", "string" => "hello"), array("languageCode" => "IT", "string" => "ciao"), array("languageCode" => "CHS

很难解释,下面是一个例子:

$strings = array(
   array("languageCode" => "ES",  "string" => "hola"),
   array("languageCode" => "EN",  "string" => "hello"),
   array("languageCode" => "IT",  "string" => "ciao"),
   array("languageCode" => "CHS", "string" => "您好"),
);
我想通过定义顺序,按
languageCode
value对字符串进行排序:

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


我现在知道,这是一个简单的问题,解决几个循环。我需要一个非常快速的函数(它被多次调用,使用大数组)

如果给一种语言赋予权重不是问题,那么排序会变得更容易,因此也会更快

您可以使用
asort
根据
$languageCodeOrder
存储的权重对数组进行排序。如果一种语言在
$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排序算法,而不是尝试实现自定义算法


可以随意修改算法中的任何内容(顺序或任何内容)。

不使用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);
}
输出至:

$magic_order
也可以为空。如果是这样的话,数组将被重新索引。带有值的数组,不存在于
$magic_顺序中
将下移并保持其顺序


不确定,如果这正是您所需要的。

您对语言中没有条目的值的期望值是多少?@MarkBaker如果定义的顺序采用该位置,否则保持其位置该函数与我的类似(请参见我的编辑)。然而,我希望秩序中不存在语言,保持它们的地位。如果可能,最好根据新位置(0,1,2)和(1,2,4)重新计算指数。非常感谢,非常简单,很高兴您喜欢@SimoneNigro:)
$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] => 您好
        )

)