【问题标题】:Sorting out associative arrays according to values根据值对关联数组进行排序
【发布时间】:2019-08-10 05:44:06
【问题描述】:

在数组的每个元素中,第二个值指向元素本身的父元素。 例如,在第一个数组中,“City”是根元素,“Area”是第一个子元素,因为第二个“Area”元素 (1) 指向“City”的键。

样本数据

$locations = array(
    3 => array("Building", 2),
    2 => array("Area", 1),
    0 => array("Floor", 3),
    1 => array("City"),
    4 => array("Room", 0),

    13 => array("Building1", 12),
    12 => array("Area1", 11),
    14 => array("Room1", 10),
    10 => array("Floor1", 13),
    11 => array("City1")
);

预期输出

Room > Floor > Building > Area > City

Room1 > Floor1 > Building1 > Area1 > City1

我的解决方案

$route = [];

foreach ($locations as $locationKey => $locationArray) {

    if (!isset($locationArray[1])) continue;

    $nextLocation = $locations[$locationArray[1]][0];
    $route[] = $nextLocation;
}

但是,它不会添加数组中没有给定索引的数组,例如索引 4 array("room", 0);

另外,如果一条路线完成,我不知道如何拆分路线

我得到的输出:

Array
(
[0] => Area
[1] => City
[2] => Building
[3] => Floor
[4] => Area1
[5] => City1
[6] => Floor1
[7] => Building1
)

【问题讨论】:

  • 你得到什么输出?
  • 查看我的更新输出。
  • 我的意思是根据预期的输出格式,您得到的输出是什么?
  • 使用 for 循环无法获得输出。您将需要对数据进行递归。

标签: php arrays sorting associative-array


【解决方案1】:

你可以这样做:

首先保存字典,了解如何获取每个节点和根:

$dic = [];
$roots = [];
foreach($locations as $k => $e) {
    if (count($e) == 2)
        $dic[$e[1]] = $k;
    else
        $roots[] = $k;
}

然后循环所有根并创建路径:

foreach($roots as $root) {
    $path = [];
    $node = $root;
    while (isset($dic[$node])) {
        $path[] = $locations[$node][0];
        $node = $dic[$node];
    }
    $path[] = $locations[$node][0];
    echo implode(",", array_reverse($path)) . PHP_EOL;
}

现场示例:3v4l

【讨论】:

  • 啊哈!我没想到。
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多