【问题标题】:How to alphabetize array while retaining tree hierarchy?如何在保留树层次结构的同时按字母顺序排列数组?
【发布时间】:2012-12-29 23:04:15
【问题描述】:

我有 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 作为数组索引,第二个数组包含每个类别的深度。第一个数组用于生成 HTML <select> 输入,但我现在需要按字母顺序排列此数组,同时保持正确的类别层次结构。所以我需要得到一个这样的输出数组。

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

我怎样才能做到这一点?

【问题讨论】:

  • 如果您管理它以从该列表中创建一个 RecursiveIterator,您可以对其进行排序:stackoverflow.com/a/2932200/367456
  • 我会调查array_multisort - php.net/manual/en/function.array-multisort.php
  • 两个数组都有一个已知的深度:1。
  • 你是如何将孩子与父母联系起来的。它不能只是深度吗? ...是否带有父母ID?很高兴看到您的原始数组的 print_r ...
  • 你可以在下面找到答案,递归迭代器在这里并不是必需的,它向你展示了一些简单的方法来为每个条目创建一个排序键。

标签: php arrays sorting recursion


【解决方案1】:

考虑到$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];

现在您可以根据$sortkeys 数组对$list 数组进行排序。这可以通过 PHP 的 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
)

观看完整的示例运行:Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2012-12-11
    • 1970-01-01
    • 2019-03-05
    • 2021-06-25
    相关资源
    最近更新 更多