php顺序数组有两种方式


php order array in two ways

我试图通过以下两种方式对数组的元素进行排序:

  • 按键长度排序(最小值应优先)-请参阅此处
  • 最大值应优先

要按密钥长度排序,我使用这个:

    function sortByLength($a,$b){
      if($a == $b) return 0;
      return (strlen($a) < strlen($b) ? -1 : 1);
    }
    uasort($deals_tag,'sortByLength');

数组是这样排序的:

Array
(
 [/merchantProductFeed] => 1
 [/merchantProductFeed/merchant] => 1
 [/merchantProductFeed/merchant/prod/text] => 158
 [/merchantProductFeed/merchant/prod] => 158
)

我希望它像这样排序:

Array
(
 [/merchantProductFeed/merchant/prod] => 158
 [/merchantProductFeed/merchant/prod/text] => 158
 [/merchantProductFeed] => 1
 [/merchantProductFeed/merchant] => 1
)

请注意,数组首先按键长度排序,然后按最大值排序。

我不知道该怎么做。

如有任何帮助,我们将不胜感激!非常感谢。

已更新:您可以使用array_mulisort。尝试

$k= array();
$v = array();
foreach($deals_tag as $key => $value){
    $k[] = $key;
    $v[] = $value;
}
array_multisort($v, SORT_DESC, $k, SORT_ASC,  $deals_tag);

我知道这可能有点开销,但排序的另一种方法是使用(临时)DB,如果我需要一些"核心"排序,我会亲自使用它,所以它在这里…

<?php
$p = new PDO("sqlite::memory:");
$p->exec("CREATE TABLE a (k varchar(255),v int)");
$p->exec("INSERT INTO a (k,v) VALUES('/merchantProductFeed',1)");
$p->exec("INSERT INTO a (k,v) VALUES('/merchantProductFeed/merchant',1)");
$p->exec("INSERT INTO a (k,v) VALUES('/merchantProductFeed/merchant/prod/text',158)");
$p->exec("INSERT INTO a (k,v) VALUES('/merchantProductFeed/merchant/prod',158)");
$st=$p->query("SELECT * FROM a ORDER BY length(k) DESC,v DESC");
print_r($st->fetchAll());
?>

我不知道你的字符串有多长,在这个例子中,我使用了varchar(255),如果它更长,你应该使用TEXT。