PHP - вложенный массив срезов - PullRequest
0 голосов
/ 09 мая 2020

У меня есть два вложенных массива разной длины. Я хочу сделать длину второго массива в соответствии с первым массивом, см. Примеры ниже, чтобы понять. Просто удалите все элементы, которых нет в первом массиве. Иногда второй массив имеет больше значений, чем первый массив, в этом случае моя древовидная структура ломается. Эти массивы являются вложенными массивами, поэтому простой array_slice не работает.

Вот структура массива.

Первый массив

 "1": {
    "id": "1",
    "username": "username",
    "children": [
      {
        "id": "-1",
        "username": "NULL",
        "children": [
          {
            "id": "-1",
            "username": "NULL",
            "children": [
              {
                "id": "-1",
                "username": "NULL",
                "children": []
              }
            ]
          }
        ]
      }
    ]
  }

Второй массив

"157": {
    "id": "157",
    "username": "test1",
    "children": [
      {
        "id": "158",
        "username": "test1",
        "children": [
          {
            "id": "159",
            "username": "test2",
            "children": [
              {
                "id": "160",
                "username": "test3",
                "children": []
              },
              {
                "id": "160",
                "username": "KICK ME BECAUSE I M NOT EXIST IN FIRST ARRAY",
                "children": []
              }
            ]
          }
        ]
      },
      {
        "id": "160",
        "username": "KICK ME BECAUSE I M NOT EXIST IN FIRST ARRAY",
        "children": [
          {
            "id": "159",,
            "username": "KICK ME BECAUSE I M NOT EXIST IN FIRST ARRAY",

            "children": [
              {
                "id": "161",
                "username": "KICK ME BECAUSE I M NOT EXIST IN FIRST ARRAY",
                "children": []
              }
            ]
          }
        ]
      }

    ]
  }

Ожидаемый результат

"157": {
    "id": "157",
    "username": "test1",
    "children": [
      {
        "id": "158",
        "username": "test1",
        "children": [
          {
            "id": "159",
            "username": "test2",
            "children": [
              {
                "id": "160",
                "username": "test3",
                "children": []
              },

            ]
          }
        ]
      },
    ]
  }

Я пробую этот метод, но он не работает.

        $firstCount = (array_map('count', $actualTree));
        $secondCount = (array_map('count', $emptyTree));
        $chunk =  array_slice($actualTree, 0 , $second[$this->userId], true);

Вариант использования

Я хочу полностью удалить те дочерние элементы массива, которых нет в первом массиве. Я строю бинарное дерево до трех уровней. В первом массиве уже есть двоичное дерево с пустыми значениями. Второй массив - это данные, поступающие из базы данных, и я просто заменяю пустые данные фактическими данными с помощью array_replace. Это работает хорошо, пока второй массив не будет иметь больше значений, чем первый массив. Итак, чтобы он заработал, мне нужно удалить эти лишние элементы.

Может ли кто-нибудь помочь мне сделать там такую ​​же длину. Любая помощь будет оценена по достоинству. Заранее спасибо.

1 Ответ

2 голосов
/ 12 мая 2020

Произошло чудо переполнения стека ... Я получил рекурсивный фрагмент для работы на первом проходе! Обычно у меня уходит хороший час или два, чтобы написать что-то, что работает.

  1. это работает для вашего образца ввода
  2. для меня полночь, я устал, и мне нужно работать утром

Фактически, это синхронно & рекурсивно выполняет итерацию по каждому массиву и сохраняет каждый уровень входного массива в выходной массив до тех пор, пока в массиве структуры существуют одинаковые ключи уровня.

Код: ( Демо )

function truncateRecursive($structure, $entry) {
    $output = [];
    while (($structureKey = key($structure)) !== null && ($entryKey = key($entry)) !== null) {
        $output[$entryKey] = !is_array($entry[$entryKey])
            ? $entry[$entryKey]
            : truncateRecursive($structure[$structureKey], $entry[$entryKey]);
        unset($structure[$structureKey], $entry[$entryKey]);    
    }
    return $output;
}

var_export(truncateRecursive($structure, $entry));

Вывод:

array (
  157 => 
  array (
    'id' => '157',
    'username' => 'test1',
    'children' => 
    array (
      0 => 
      array (
        'id' => '158',
        'username' => 'test1',
        'children' => 
        array (
          0 => 
          array (
            'id' => '159',
            'username' => 'test2',
            'children' => 
            array (
              0 => 
              array (
                'id' => '160',
                'username' => 'test3',
                'children' => 
                array (
                ),
              ),
            ),
          ),
        ),
      ),
    ),
  ),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...