3

このような長さ/深さの不明な配列が2つあります

[1] => Hand Tools
[2] => Power Tools
[4] =>  ╚═►Outdoor Tools
[6] =>    ╚═►dvjdg
[5] =>  ╚═►Indoor Tools
[7] =>    ╚═►blaha
[8] =>    ╚═►blahb
[3] => Garden Tools

[1] => 0
[2] => 0
[4] => 1
[6] => 2
[5] => 1
[7] => 2
[8] => 2
[3] => 0

どちらcategory idの配列も配列インデックスとして a を使用し、2 番目の配列には各カテゴリの深さが含まれます。最初の配列は HTML<select>入力を生成するために使用されますが、適切なカテゴリ階層を維持しながら、この配列をアルファベット順に並べる必要があります。したがって、このような出力配列を取得する必要があります。

[3] => Garden Tools
[1] => Hand Tools
[2] => Power Tools
[5] =>  ╚═►Indoor Tools
[7] =>    ╚═►blaha
[8] =>    ╚═►blahb
[4] =>  ╚═►Outdoor Tools
[6] =>    ╚═►dvjdg

どうすればこれを達成できますか?

4

1 に答える 1

2

それが配列であることを考えると$list、各「サブ」要素はその親の情報 (テキスト) を保持していないため、簡単に並べ替えることができません。したがって、最初にその情報を追加します。

  1. レベルを取得します。
  2. そのレベルの現在の値を設定します。
  3. より高いレベルを削除します。
  4. テキストで使用されていない文字を使用して、すべてのレベルをマージします。

そして、あなたはソートキーを持っています。すべてのリストエントリに対してこれを行うと、すべてのソートキーが得られます:

$sortkeys = [];
$levels   = [];
foreach ($list as $index => $entry) {
    $level            = strspn($entry, ' ');
    $levels[$level]   = $entry;
    $sortkey          = implode('|', array_slice($levels, 0, $level + 1));
    $sortkeys[$index] = $sortkey;
}

この例では、レベル情報を簡単に取得できます。レベルごとに 1 つのスペースを数えました。あなたはそれとは異なる機能を持っていて、それとは異なる機能を使用しているかもしれませんstrspn。ほとんどの場合、そのために 2 番目の配列を使用します。私はそれを入力するのが面倒だったので、関数でそれを行いました。あなたの可能性は次のとおりです。

$level = $category_levels[$index];

$listこれで、配列に基づいて配列を並べ替えることができます$sortkeysarray_multisortこれは、PHP の関数を使用して実行できます。この関数は数値キーの番号を付け直すため、キーもソートし、ソート後に結合してキーを保持します。

$keys = array_keys($list);
array_multisort($sortkeys, SORT_ASC, $list, $keys);

print_r(array_combine($keys, $list));

これにより、次のことが得られます。

Array
(
    [3] => Garden Tools
    [1] => Hand Tools
    [2] => Power Tools
    [5] =>  ╚═►Indoor Tools
    [7] =>   ╚═►blaha
    [8] =>   ╚═►blahb
    [4] =>  ╚═►Outdoor Tools
    [6] =>   ╚═►dvjdg
)

実行中の完全な例を見る:デモ

于 2012-12-29T23:38:12.703 に答える