Вложенные массивы с неопределенной длиной: получить наиболее вложенный массив - PullRequest
0 голосов
/ 06 ноября 2018

Я делаю запрос к API, и для каждого запроса я возвращаю массив с BrowseNodes. Внутри этого массива я получаю такой результат:

array:1 [
  "BrowseNode" => array:3 [
    "BrowseNodeId" => "2502033031"
    "Name" => "OBD-II Diagnosewerkzeuge"
    "Ancestors" => array:1 [
      "BrowseNode" => array:3 [
        "BrowseNodeId" => "5142250031"
        "Name" => "Motorwerkzeuge & Zubehör"
        "Ancestors" => array:1 [
          "BrowseNode" => array:3 [
            "BrowseNodeId" => "2502064031"
            "Name" => "Werkzeuge"
            "Ancestors" => array:1 [
              "BrowseNode" => array:4 [
                "BrowseNodeId" => "79899031"
                "Name" => "Kategorien"
                "IsCategoryRoot" => "1"
                "Ancestors" => array:1 [
                  "BrowseNode" => array:2 [
                    "BrowseNodeId" => "78191031"
                    "Name" => "Auto & Motorrad"
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ]
  ]
]

Если бы это был фиксированный массив, который всегда имел такую ​​длину, мне было бы легко получить последний массив BrowseNode и значение с ключом «Имя». В этом случае это будет "Name" => "Auto & Motorrad".

Однако, поскольку категория может иметь один или несколько вложенных массивов, она не является статической ...

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

Итак, я должен перебирать свой массив, пока массив BrowseNode больше не будет иметь массив Ancestors и не получит имя этого массива BrowseNode.

Ребята, у вас есть идеи, как это сделать?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Возможно, существует более «правильный» способ сделать это, но, поскольку я пишу это на своем телефоне в самолете, вам придется простить меня за то, что я не смог проверить его ответ. Но вы можете выполнить рекурсивную функцию, например ...

function recurseArray($browseNode) 
{
    if(isset($browseNode["Ancestors"])) {
        recurseArray($browseNode["Ancestors"]["browseNode"])
    } else {
        // Do whatever you want with the last iteration
    }
}

Надеюсь, что это имеет смысл!

0 голосов
/ 06 ноября 2018

Я думаю, вы можете использовать рекурсию для достижения этой цели

На каждом объекте ищите Ancestors, если не найден, возвращайте имя, иначе сделайте это снова для Предков.

Рассмотрим следующий код:

$arr = array("BrowseNode" => array("BrowseNodeId" => "1", "Ancestors" => array("BrowseNode" => array("BrowseNodeId" => "2", "Ancestors" => array("BrowseNode" => array("BrowseNodeId" => "3"))))));

function getLastName($elem) {
    $elem = $elem["BrowseNode"];
    if (!array_key_exists("Ancestors", $elem))
         return $elem['BrowseNodeId'];
    else return getLastName($elem["Ancestors"]);
}

echo getLastName($arr);

Обратите внимание, что этот код возвращает id вместо вашего Name - небольшая модификация, которую я оставляю вам ...

...