繁体   English   中英

如何在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM