【问题标题】:Nested arrays with undefinded lenght: Get most nested array未定义长度的嵌套数组:获取最多的嵌套数组
【发布时间】:2019-04-09 18:59:05
【问题描述】:

我正在向 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”的值。在这种情况下,它将是这个"Name" => "Auto & Motorrad"

但是,因为一个类别可以有一个或多个嵌套数组,所以它不是静态的...

这意味着我必须找到一种解决方案,以始终获取嵌套最多的数组,并从中获取名称以获取类别。因为它是动态数据,我不知道如何解决那。我只知道我总是必须得到BrowseNode,然后进入BrowseNode 数组。我必须再次获得Ancestors 和这个Ancestors。我必须获取BrowseNode 数组,直到我到达最后一个BrowseNode 数组并获取名称。

所以,我必须遍历我的数组,直到 BrowseNode 数组不再有 Ancestors 数组并获取此 BrowseNode 数组的名称。

你们对如何做到这一点有任何想法吗?

【问题讨论】:

  • 如果您包含包含分叉的示例数据,您的问题会更清楚(更好地理解任务要求)。然后你可以更好地解释“深度”因素。
  • @Jan 我的帖子是回答你还是我错过了这个问题?
  • 是的,确实如此。抱歉,忘记点赞了! :) @DavidWinder

标签: php arrays laravel loops multidimensional-array


【解决方案1】:

我想你可以使用递归来实现这一点。

在每个对象上,搜索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 - 我留给您的小修改...

【讨论】:

    【解决方案2】:

    可能有一种更“正确”的方法可以做到这一点,但由于我是在飞机上用手机写的,所以您必须原谅我无法证明我的答案。但是你可以做一个递归函数,比如......

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

    希望这是有道理的!

    【讨论】:

    • 这和我的答案有什么重要的区别吗?
    • 不,实际上是一样的,你打败了我。积分应该归大卫温德爵士
    • @DavidWinder 我认为您的任何一个答案都没有检查“最深”的数据。阅读问题中的细则。
    • @mickmackusa 你能告诉我吗
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2015-03-24
    • 2022-01-22
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多