【问题标题】:php order array in two waysphp排序数组的两种方式
【发布时间】:2012-07-27 06:11:00
【问题描述】:

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

  • 按密钥长度排序(最小的应该在前)-See here
  • 最大值应该在前

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

    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
)

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

我不知道该怎么做。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 你可以简化sortByLength():return strlen($a) - strlen($b);
  • uasort 是按值排序,而不是按键。

标签: php arrays sorting


【解决方案1】:

更新:您可以使用array_mulitsort。试试

$k= array();
$v = array();

foreach($deals_tag as $key => $value){
    $k[] = $key;
    $v[] = $value;
}

array_multisort($v, SORT_DESC, $k, SORT_ASC,  $deals_tag);

【讨论】:

  • 我试过了,我得到 [/merchantProductFeed] => 1, [/merchantProductFeed/merchant] => 1, [/merchantProductFeed/merchant/prod] => 158, [/merchantProductFeed/merchant/产品/文本] => 158
  • 你是救生员!非常感谢你做的这些!真的帮了我一把!
【解决方案2】:

我知道这可能会有点开销,但另一种排序方式是使用(临时)数据库,如果我需要一些“硬核”排序,我会亲自使用它,所以这里是......

<?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。

【讨论】:

  • 我很感激你花时间写一个答案,但在我的例子中,字符串 /merchantProductFeed/merchant/prod 作为一个完整的字符串保存在数据库中,然后我通过使用将它分成几部分explode.
猜你喜欢
  • 2015-05-31
  • 1970-01-01
  • 2017-01-15
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多