Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Sorting - Fatal编程技术网

php顺序数组有两种方式

php顺序数组有两种方式,php,arrays,sorting,Php,Arrays,Sorting,我试图通过以下两种方式对数组的元素进行排序: 按键长度排序(最小值应排在第一位)—— 最大值应该优先 要按键长度排序,我使用以下方法: function sortByLength($a,$b){ if($a == $b) return 0; return (strlen($a) < strlen($b) ? -1 : 1); } uasort($deals_tag,'sortByLength'); 我想把它分类如下: Array (

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

  • 按键长度排序(最小值应排在第一位)——
  • 最大值应该优先
要按键长度排序,我使用以下方法:

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

    uasort($deals_tag,'sortByLength');
我想把它分类如下:

Array
(
 [/merchantProductFeed/merchant/prod] => 158
 [/merchantProductFeed/merchant/prod/text] => 158
 [/merchantProductFeed] => 1
 [/merchantProductFeed/merchant] => 1
)
请注意,数组首先按键长度排序,然后按最大值排序

我不知道怎么做


任何帮助都将不胜感激!谢谢大家!

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


我知道这可能会有一点开销,但另一种排序方式是使用(临时)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());
?>

您可以简化
排序长度()
返回strlen($a)-strlen($b)
uasort
是按值排序,而不是按键排序。我试过了,得到了[/merchantProductFeed]=>1、[/merchantProductFeed/merchant]=>1、[/merchantProductFeed/merchant/prod]=>158、[/merchantProductFeed/merchant/prod/text]=>158你真是个救命稻草!非常感谢你!真的帮了我一把!我非常感谢您花时间写了一个答案,但在我的例子中,字符串/merchantProductFeed/merchant/prod作为一个完整的字符串保存在数据库中,然后我使用
explode
将其分解为多个部分。
$k= array();
$v = array();

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

array_multisort($v, SORT_DESC, $k, SORT_ASC,  $deals_tag);
<?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());
?>