php - 找到合适的 child 后如何在多维数组中向上导航?

标签 php arrays multidimensional-array

我有一个如下所示的数组:

RecursiveArrayIterator {#605 ▼
  +"xs:schema": array:2 [▼
    "value" => array:1 [▼
      "xs:element" => array:2 [▼
        "value" => array:1 [▼
          "xs:complexType" => array:2 [▼
            "value" => array:2 [▼
              "xs:sequence" => array:2 [▼
                "value" => array:1 [▼
                  "xs:element" => array:3 [▼
                    0 => array:2 [▼
                      "value" => array:1 [▼
                        "xs:simpleType" => array:2 [▼
                          "value" => array:1 [▼
                            "xs:restriction" => array:2 [▼
                              "value" => array:1 [▼
                                "xs:maxLength" => array:1 [▼
                                  "attributes" => array:1 [▼
                                    "value" => "40"
                                  ]
                                ]
                              ]
                              "attributes" => array:1 [▶]
                            ]
                          ]
                          "attributes" => []
                        ]
                      ]
                      "attributes" => array:1 [▼
                        "name" => "title"
                      ]
                    ]
                    1 => array:2 [▶]
                    2 => array:2 [▶]
                  ]
                ]
                "attributes" => []
              ]
              "xs:attribute" => array:2 [▶]
            ]
            "attributes" => []
          ]
        ]
        "attributes" => array:1 [▼
          "name" => "book"
        ]
      ]
    ]
    "attributes" => []
  ]
}

我需要访问 xs:maxLength 属性,为此,我使用了以下方法:

private function findRestrictions(array $haystack, $needle)
{
    $iterator = new \RecursiveArrayIterator($haystack);
    $recursive = new \RecursiveIteratorIterator(
        $iterator,
        \RecursiveIteratorIterator::SELF_FIRST
    );

    foreach ($recursive as $key => $value)
    {
        if ($key === $needle)
        {
            return (int)$value['attributes']['value'];
        }
    }
}

$maxLength = findRestrictions($array, 'xs:maxLength');

所以这让我返回 40,就像预期的那样。无论如何,我的问题是我需要知道这个限制属于哪个元素,这在 xs:element[0]['attributes']['name'] 中提到,我不确定关于如何根据 xs:maxLength 的匹配到达那里获取我需要的信息。

最佳答案

嗯,我编写了一个我认为相当不错的解决方案,这次对其进行了测试。

我的示例数组:

$array = [
        "we" => 
            ["are" => [
                "lorem" => [
                    "gone" => "away",
                    "my" => "friend"
                    ],
                "never" => "abcd",
                "any" => [
                        "btc" => "abc",
                        "help" => [
                            "mqf" => "bmx"
                            ]
                    ]
                ]
            ],
         "fancy" => [
                "lorem" => [
                    "gone" => "away",
                    "my" => "friend"
                    ],
                "never" => "abcd",
                "any" => [
                        "btc" => "abc",
                        "help" => [
                            "mqf" => "bmx",
                            "abc" => 13
                            ]
                    ]
                ],
         "beer" => "bar",
         "helpful" => [
                "meta" => "column",
                "gamma" => [
                    "lorem" => [
                        "gone" => "mad",
                        "my" => "drink"
                        ],
                    "never" => "abcd",
                    "any" => [
                            "btc" => "abc",
                            "help" => [
                                "mqf" => "bmx",
                                "abc" => "alot"
                                ]
                        ]
                    ]
             ],
          "elements" => [
                0 => 88,
                1 => 99
              ]
        ];

我的解决方案:

    function array_find_value_return_parent($array,$needle,$parentkey) {
        $iterator = new RecursiveIteratorIterator(
            new RecursiveArrayIterator($array),
            RecursiveIteratorIterator::SELF_FIRST);

        foreach($iterator as $key => $value) {
            if($value === $needle) {
                for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) {
                    if($iterator->getSubIterator($i)->key() === $parentkey) {
                        return $iterator->getSubIterator($i)->current();
                    }
                }
            }
        }
    }

    function array_find_key_return_value($array,$findkey) {
        $iterator = new RecursiveIteratorIterator(
            new RecursiveArrayIterator($array),
            RecursiveIteratorIterator::SELF_FIRST);

        foreach($iterator as $key => $value) {
            if($findkey === $key) {
               return $iterator->current();
            }
        }
    }

我的测试:

    $findvalue = "alot";
    $findparentkey = "gamma";
    $findreturnkey = "gone";

   echo array_find_key_return_value(array_find_value_return_parent($array,$findvalue,$findparentkey),$findreturnkey);

Output: mad

对于您的情况,这意味着您可以执行以下操作:

    $findvalue = "40";
    $findparentkey = "xs:element";
    $findreturnkey = "name";

   echo array_find_key_return_value(array_find_value_return_parent($array,$findvalue,$findparentkey),$findreturnkey);

Expected output: title

对吧?

关于php - 找到合适的 child 后如何在多维数组中向上导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49923753/

相关文章:

javascript - 如何消除单个数组中元素的额外匹配

java - 移动二维数组中的元素 - Java

php - JSON 只有一行在打印

java - 将 java 数组 "over"复制到另一个

c++ - C++-检查一个字符串数组是否包含另一个字符串的所有元素

c# - 我如何在 C# 中添加按钮?

php - Yii INSERT ... 重复更新

php - 根据给定的字符串对数组进行排序

php - 匹配两个不带秒的日期并显示结果

php - 不做前端开发需要安装 `fxp/composer-asset-plugin`吗