2

次の 2 つの方法で配列の要素を並べ替えようとしています。

キーの長さで並べ替えるには、これを使用します。

    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
)

最初に配列がキーの長さでソートされ、次に最大値でソートされることに注意してください。

私はそれを行う方法がわかりません。

どんな助けでも大歓迎です!ありがとうございました!

4

2 に答える 2

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());
?>

文字列の長さがわかりません。この例では、varchar(255)を使用しました。これより長い場合は、TEXTを使用する必要があります。

于 2012-07-29T05:52:38.620 に答える
1

更新: array_mlitsortを使用できます。試す

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

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

array_multisort($v, SORT_DESC, $k, SORT_ASC,  $deals_tag);
于 2012-07-29T05:24:01.653 に答える