【问题标题】:PHP - Creating path list from arrayPHP - 从数组创建路径列表
【发布时间】:2019-08-11 16:57:12
【问题描述】:

我有一个 id 数组,它们形成一个树形结构,用于存储类型的应用程序。

然后树形结构显示类似这样

我要做的是创建每个数组元素的完整路径的列表。

[366 => '文件',356 => '其他',354 => '照片',368 = '照片/城市',375 = '照片/城市/英格兰',376 = '照片/城市/苏格兰']

菜单是用户定义的,所以这只是一个例子,它可以有更多的级别。

每个数组元素的名称是从名称数组中添加的,即名称[376](照片)

我已经尝试了几个递归函数并且很挣扎,我希望比我更擅长 PHP 的人可以提供帮助! 谢谢

【问题讨论】:

  • 不是真正的骗子,但非常相关,也许有帮助:stackoverflow.com/questions/3544988/…
  • 您的意思是:recursion
  • 文件夹名称从何而来,是否在“id数组”中?
  • 文件夹名称来自另一个名称数组,即 $names[376] 将是照片
  • 我不清楚数据。如何表达父关系。您是否编写了渲染代码,因为我猜您完全可以回答自己的问题。代码还是数据?否则只会建议通用网络resources/tutorials

标签: php arrays tree


【解决方案1】:

我希望我了解您想要实现的目标。在这种情况下,这可能是一个解决方案

<?php

$ids = [
  354 => [
    368 => [
      375,
      376
    ]
  ],
  356,
  366
];

$names = [
    354 => "Photos", 
    368 => "Cities",
    375 => "England",
    376 => "Scotland",
    356 => "Files",
    366 => "Misc"
];


print_r(build_list($ids));

function build_list($ids, $path = ""){
  global $names;
  $list = [];
  foreach($ids as $key => $value){
    if(is_array($value)){
      //$list[$key] = $path . $names[$key]; // uncomment if you need output (2)
      $list = array_replace_recursive($list, build_list($value, ($path . $names[$key] . "/")))
    }else{
      $list[$value] = $path . $names[$value];
    }
  }
  return $list;
}

?>

输出 (1)

Array
(
  [375] => Photos/Cities/England
  [376] => Photos/Cities/Scotland
  [356] => Files
  [366] => Misc
)

输出 (2)

Array
(
  [354] => Photos
  [368] => Photos/Cities
  [375] => Photos/Cities/England
  [376] => Photos/Cities/Scotland
  [356] => Files
  [366] => Misc
)

【讨论】:

  • 谢谢你,除了需要数组键作为每个数组值中最后一项的 id 之外,这有点正确......抱歉不是很清楚Array([375] => Photos/Cities/英格兰 [376] => 照片/城市/苏格兰 [356] => 文件 [366] => 其他)
  • @user3459394 检查编辑后的答案。有点晚了,但至少你有两个解决方案
【解决方案2】:

这个函数会做你想做的事。它递归遍历树,为每个键创建元素并通过递归向下传递前缀以创建每个元素的名称:

function make_paths($array, $names, $prefix = '') {
    $output = array();
    foreach ($array as $key => $arr) {
        $name = $prefix . ($prefix != '' ? '/' : '') . $names[$key];
        if (count($arr)) {
            $output = $output + make_paths($arr, $names, $name);
        }
        $output[$key] = $name;
    }
    return $output;
}

输出:

Array (
    [375] => Photos/Cities/England
    [376] => Photos/Cities/Scotland
    [368] => Photos/Cities
    [354] => Photos
    [356] => Misc
    [366] => Files 
)

Demo on 3v4l.org

【讨论】:

  • 我很好奇你为什么决定不接受这个答案?它给出的结果与后一个完全相同。
猜你喜欢
  • 2017-02-06
  • 2014-10-22
  • 2012-11-23
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多