【问题标题】:Recursion doesn't continue with next items递归不会继续下一项
【发布时间】:2021-05-11 21:44:46
【问题描述】:

我有一个这样的数组:

object(SimpleXMLElement)#29 (1) {
  ["CATEGORY"]=>
  object(SimpleXMLElement)#30 (4) {
    ["CATEGORY_ID"]=>
    string(1) "1"
    ["CATEGORY_NAME"]=>
    string(39) "Дамски дрехи и обувки"
    ["CATEGORY_FULLNAME"]=>
    string(39) "Дамски дрехи и обувки"
    ["CATEGORY"]=>
    object(SimpleXMLElement)#31 (4) {
      ["CATEGORY_ID"]=>
      string(3) "180"
      ["CATEGORY_NAME"]=>
      string(23) "Дамски дрехи"
      ["CATEGORY_FULLNAME"]=>
      string(76) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи"
      ["CATEGORY"]=>
      array(2) {
        [0]=>
        object(SimpleXMLElement)#32 (4) {
          ["CATEGORY_ID"]=>
          string(3) "184"
          ["CATEGORY_NAME"]=>
          string(10) "Рокли"
          ["CATEGORY_FULLNAME"]=>
          string(89) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли"
          ["CATEGORY"]=>
          object(SimpleXMLElement)#34 (3) {
            ["CATEGORY_ID"]=>
            string(5) "78355"
            ["CATEGORY_NAME"]=>
            string(25) "Спортни рокли"
            ["CATEGORY_FULLNAME"]=>
            string(123) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли | Спортни рокли
                    "
          }
        }
        [1]=>
        object(SimpleXMLElement)#33 (3) {
          ["CATEGORY_ID"]=>
          string(3) "234"
          ["CATEGORY_NAME"]=>
          string(8) "Поли"
          ["CATEGORY_FULLNAME"]=>
          string(87) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Поли"
        }
      }
    }
  }
}

通过递归,我试图在另一个数组中获取所有类别和子类别,并为每个子类别设置CATEGORY_PARENT_ID

$values = [];
        foreach ($xml as $item) {
            $item = (array)$item;
            $values[] = [
                'CATEGORY_ID' => $item['CATEGORY_ID'],
                'CATEGORY_NAME' => $item['CATEGORY_NAME'],
                'CATEGORY_FULLNAME' => $item['CATEGORY_FULLNAME'],
                'CATEGORY_PARENT_ID' => null
            ];
            if (!isset($item['CATEGORY'])) {
                continue;
            } else
                $this->getSubCategories($item['CATEGORY'], $item['CATEGORY_ID'], $values);
        }
        var_dump($values);die;

private function getSubCategories($category, $parent_id, &$values)
    {
        $category = (array)$category[0];

        if (!$category) {
            return false;
        }

        $values[] = [
            'CATEGORY_ID' => $category['CATEGORY_ID'],
            'CATEGORY_NAME' => $category['CATEGORY_NAME'],
            'CATEGORY_FULLNAME' => $category['CATEGORY_FULLNAME'],
            'CATEGORY_PARENT_ID' => $parent_id
        ];

        if (!isset($category['CATEGORY'])) {
            return false;
        }

        return $this->getSubCategories($category['CATEGORY'], $category['CATEGORY_ID'], $values);
    }

问题是当递归命中78355 子类别时,它不会返回,我无法获得234 类别。我知道这是因为我知道我返回的是假的。但不明白如何使脚本正确。它的当前输出是(缺少234 项):

array(4) {
  [0]=>
  array(4) {
    ["CATEGORY_ID"]=>
    string(1) "1"
    ["CATEGORY_NAME"]=>
    string(39) "Дамски дрехи и обувки"
    ["CATEGORY_FULLNAME"]=>
    string(39) "Дамски дрехи и обувки"
    ["CATEGORY_PARENT_ID"]=>
    NULL
  }
  [1]=>
  array(4) {
    ["CATEGORY_ID"]=>
    string(3) "180"
    ["CATEGORY_NAME"]=>
    string(23) "Дамски дрехи"
    ["CATEGORY_FULLNAME"]=>
    string(76) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи"
    ["CATEGORY_PARENT_ID"]=>
    string(1) "1"
  }
  [2]=>
  array(4) {
    ["CATEGORY_ID"]=>
    string(3) "184"
    ["CATEGORY_NAME"]=>
    string(10) "Рокли"
    ["CATEGORY_FULLNAME"]=>
    string(89) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли"
    ["CATEGORY_PARENT_ID"]=>
    string(3) "180"
  }
  [3]=>
  array(4) {
    ["CATEGORY_ID"]=>
    string(5) "78355"
    ["CATEGORY_NAME"]=>
    string(25) "Спортни рокли"
    ["CATEGORY_FULLNAME"]=>
    string(123) "Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли | Спортни рокли
                    "
    ["CATEGORY_PARENT_ID"]=>
    string(3) "184"
  }
}

编辑用于测试的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<GLAMI>
    <CATEGORY>
        <CATEGORY_ID>1</CATEGORY_ID>
        <CATEGORY_NAME>Дамски дрехи и обувки</CATEGORY_NAME>
        <CATEGORY_FULLNAME>Дамски дрехи и обувки</CATEGORY_FULLNAME>
        <CATEGORY>
            <CATEGORY_ID>180</CATEGORY_ID>
            <CATEGORY_NAME>Дамски дрехи</CATEGORY_NAME>
            <CATEGORY_FULLNAME>Glami.bg | Дамски дрехи и обувки | Дамски дрехи</CATEGORY_FULLNAME>
            <CATEGORY>
                <CATEGORY_ID>184</CATEGORY_ID>
                <CATEGORY_NAME>Рокли</CATEGORY_NAME>
                <CATEGORY_FULLNAME>Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли</CATEGORY_FULLNAME>
                <CATEGORY>
                    <CATEGORY_ID>78355</CATEGORY_ID>
                    <CATEGORY_NAME>Спортни рокли</CATEGORY_NAME>
                    <CATEGORY_FULLNAME>Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Рокли | Спортни рокли
                    </CATEGORY_FULLNAME>
                </CATEGORY>
            </CATEGORY>
            <CATEGORY>
                <CATEGORY_ID>234</CATEGORY_ID>
                <CATEGORY_NAME>Поли</CATEGORY_NAME>
                <CATEGORY_FULLNAME>Glami.bg | Дамски дрехи и обувки | Дамски дрехи | Поли</CATEGORY_FULLNAME>
            </CATEGORY>
        </CATEGORY>
    </CATEGORY>
</GLAMI>

【问题讨论】:

  • 您的数据可能是 XML,而不是数组。您能否展示 XML 以便我们有一个基础进行测试?
  • 是的,准备好了。你可以看看帖子底部

标签: php recursion


【解决方案1】:

我认为使用 SimpleXML 和 XPath 更容易、更简洁。使用 xpath("//CATEGORY") 我得到所有级别的类别。我只需要测试是否有父母并分配id。

$xml = simplexml_load_string($strXML);
$nlist = $xml->xpath("//CATEGORY");

$arr = [];
foreach($nlist as $item) {
  $parent = $item->xpath("parent::*/CATEGORY_ID");
  $arr[] = [
    'CATEGORY_ID' => (string)$item->CATEGORY_ID,
    'CATEGORY_NAME' => (string)$item->CATEGORY_NAME,
    'CATEGORY_FULLNAME' => (string)$item->CATEGORY_FULLNAME,
    'CATEGORY_PARENT_ID' => empty($parent) ? NULL : (string)$parent[0]
  ];
}

测试输出

var_export($arr);
/*
array (
  0 => 
  array (
    'CATEGORY_ID' => '1',
    'CATEGORY_NAME' => 'Дамски дрехи и обувки',
    'CATEGORY_FULLNAME' => 'Дамски дрехи и обувки',
    'CATEGORY_PARENT_ID' => NULL,
  ),
  1 => 
  array (
    'CATEGORY_ID' => '180',
    'CATEGORY_NAME' => 'Дамски дрехи',
    'CATEGORY_FULLNAME' => 'Glami.bg | Дамски дрехи и обувки | Дамски дрехи',
    'CATEGORY_PARENT_ID' => '1',
  ),
..
*/

【讨论】:

  • 而你是我的救星。从字面上看,想要投票一千次。非常感谢!
猜你喜欢
  • 2017-04-18
  • 2012-05-26
  • 2022-12-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
相关资源
最近更新 更多