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

两个数组都使用 acategory id作为数组索引,第二个数组包含每个类别的深度。第一个数组用于生成 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;
}

此示例简化了获取级别信息。我计算了每个级别一个空间。您可能有不同的功能并使用不同的功能strspn。您很可能会为此使用第二个数组。我懒得打字了,所以我用函数做了。你可能只是:

$level = $category_levels[$index];

$list现在您可以根据数组对数组进行排序$sortkeys。这可以通过 PHPs 的array_multisort功能来完成。因为该函数会重新编号数字键,所以我们也对键进行排序,然后在排序后合并以保留它们:

$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 回答