Индексированный массив PHP для вложенного ассоциативного массива - PullRequest
0 голосов
/ 06 июня 2018

Мне нужно преобразовать простой массив во вложенный массив в соответствии с определенными правилами.Я достиг этого, но я ищу лучшее решение.

ПРОСТО:

array(4) {
  [0]=>
  array(2) {
    ["id"]=>
    string(2) "11"
    ["type"]=>
    int(3)
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(2) "10"
    ["type"]=>
    int(2)
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["type"]=>
    int(1)
  }
  [3]=>
  array(2) {
    ["id"]=>
    string(1) "0"
    ["type"]=>
    int(1)
  }
}

ОЖИДАЕМЫЙ ЭФФЕКТ:

array(1) {
  [0]=>
  array(2) {
    ["type"]=>
    int(1)
    ["child"]=>
    array(1) {
      [1]=>
      array(2) {
        ["type"]=>
        int(1)
        ["child"]=>
        array(1) {
          [10]=>
          array(2) {
            ["type"]=>
            int(2)
            ["child"]=>
            array(1) {
              [11]=>
              array(2) {
                ["type"]=>
                int(3)
                ["child"]=>
                array(0) {
                }
              }
            }
          }
        }
      }
    }
  }
}

МОЕ РЕШЕНИЕ (не очень удовлетворительное):

$nestedArray = [];
    foreach ($simpleArray as $item)
    {
        if (!empty($nestedArray))
        {
            $array = $nestedArray;
            reset($array);
            $firstKey = key($array);
        }
        $nestedArray[$item['id']]['child'] = $nestedArray;
        $nestedArray[$item['id']]['type'] = $item['type'];
        if (!empty($firstKey))
        {
            unset($nestedArray[$firstKey]);
        }
    }

Как я уже сказал, я ищу более элегантный способ добиться этого.Правило очень простое: каждый следующий элемент является дочерним по отношению к предыдущему.

1 Ответ

0 голосов
/ 07 июня 2018

Вы можете использовать рекурсию:

function nest($arr) {
    return count($arr) ? ["type" => array_pop($arr)["type"], "child" => nest($arr)] : [];
}

С вашим примером ввода это будет выглядеть так:

$simpleArray = [
    ["id" => "11", "type" => 3],
    ["id" => "10", "type" => 2],
    ["id" => "1", "type" => 1],
    ["id" => "0", "type" => 1]
];

function nest($arr) {
    return count($arr) ? ["type" => array_pop($arr)["type"], "child" => nest($arr)] : [];
}

$nested = nest($simpleArray));

$nested будет иметь следующее значение:

[
    "type" => 1,
    "child" => [
        "type" => 1,
        "child" => [
            "type" => 2,
            "child" => [
                "type" => 3,
                "child" => []
            ]
        ]
    ]
]
...