Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP7上使用foreach在for上迭代产品以获取特定的DOM元素_Php_For Loop_Foreach_Domdocument - Fatal编程技术网

如何在PHP7上使用foreach在for上迭代产品以获取特定的DOM元素

如何在PHP7上使用foreach在for上迭代产品以获取特定的DOM元素,php,for-loop,foreach,domdocument,Php,For Loop,Foreach,Domdocument,我真的不知道发生了什么,因为我不能迭代这个数据对象。问题是我总是打印同一个对象,但是如果我打印一个单独的值,它就在那里 每个产品都有一个隐藏的输入,我正在使用DomDocumentPHP库阅读它 <input class="productName" id="03MJRUXE" type="hidden" value="Camisa Polo Masculina Flamê"> <input class="productId" id="03MJRUXE" type="hidden

我真的不知道发生了什么,因为我不能迭代这个数据对象。问题是我总是打印同一个对象,但是如果我打印一个单独的值,它就在那里

每个产品都有一个隐藏的输入,我正在使用
DomDocument
PHP库阅读它

<input class="productName" id="03MJRUXE" type="hidden" value="Camisa Polo Masculina Flamê">
<input class="productId" id="03MJRUXE" type="hidden" value="03MJRUXE">
<input class="productPrice" id="03MJRUXE" type="hidden" value="69.99">
<input class="productCategory" id="03MJRUXE" type="hidden" value="Polos">
<input class="productBrand" id="03MJRUXE" type="hidden" value="Business">
我将在下面提供一个屏幕截图:

我迭代这些元素的函数如下:

/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @param DOMNodeList $qtdeProducts
 * @return array
 */
private function extractInfoByInputs($elements, $qtdeProducts)
{
    $productInputs = [];
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    for ($i = 0; $i < $qtdeProducts->length; $i++) {
        /**
         * @var int $k
         * @var DOMElement $element
         */
        $arrProducts = [];
        $loop = 0;
        foreach ($elements as $k => $element) {
            $class = $element->getAttribute('class');
            if (!in_array($class, $arrKeysList)) {
                unset($elements[$k]);
            } else {

                print_r($element);

                if ($loop >= sizeof($arrKeysList))
                    continue;

                $class = $element->getAttribute('class');
                $value = $element->getAttribute('value');

                $arrProducts[$loop] = [$class => $value];
                $loop++;

                /*foreach ($arrKeysList as $y => $kItem) {
                    if ($class === $kItem) {

                        $arrData[$y] = [$class => $value];
                        $arrProducts[$loop] = $arrData[$y];
                    }
                }*/

                //$productInputs[$i] = $arrProducts;
                //$loop++;
            }
        }

        $productInputs[$i] = $arrProducts;
    }

    print_r($productInputs);

    return $productInputs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )
/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @return array
 */
private function extractInfoByInputs($elements)
{
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    $arrayElements = [];
    for ($i = 0; $i < $elements->length; $i++) {
        $item = $elements->item($i);
        $class = $item->getAttribute('class');

        if (in_array($class, $arrKeysList))
            $arrayElements[] = $item;
    }

    $arrayAttrs = [];
    foreach ($arrKeysList as $y => $kItem) {
        $loop = 0;
        /**
         * @var int $k
         * @var DOMElement $element
         */
        foreach ($arrayElements as $k => $element) {
            $class = $element->getAttribute('class');
            $value = $element->getAttribute('value');

            if ($class === $kItem) {
                $arrayAttrs[$loop][$y] = [$class => $value];

                $loop++;
            }
        }
    }

    print_r($arrayAttrs);

    return $arrayAttrs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Listrada
                )

            [1] => Array
                (
                    [productId] => 03XZAMSE
                )

            [2] => Array
                (
                    [productPrice] => 59.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Tie Dye
                )

            [1] => Array
                (
                    [productId] => 03TBNCME
                )

            [2] => Array
                (
                    [productPrice] => 99.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

        etc...
Array
(
    [0] => Array
        (
            [productName] => Camisa Polo Masculina Flamê
            [productId] => 03MJRUXE
            [productPrice] => 69.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [1] => Array
        (
            [productName] => Camisa Polo Masculina Listrada
            [productId] => 03XZAMSE
            [productPrice] => 59.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [2] => Array
        (
            [productName] => Camisa Polo Masculina Tie Dye
            [productId] => 03TBNCME
            [productPrice] => 99.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [3] => Array
        (
            [productName] => Camisa Masculina Slim
            [productId] => H2EUSE01E
            [productPrice] => 119.99
            [productCategory] => Camisas
            [productBrand] => Business
        )

    [4] => Array
        (
            [productName] => Camiseta Masculina Alongada
            [productId] => 4E6QWBDE
            [productPrice] => 49.99
            [productCategory] => Camisetas
            [productBrand] => Business
        )

    [5] => ...
更新 我更新了PHP代码,还设置了一个屏幕截图


拜托,有人能帮我吗?

我解决了这个问题

有时候,抹去一切,重新开始是件好事

  • 首先,我使用for循环将DOMNodeList转换为domeElement数组
  • 其次,我创建一个属性名称列表的foreach循环和其他转换元素的foreach循环
解决方案代码如下:

/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @param DOMNodeList $qtdeProducts
 * @return array
 */
private function extractInfoByInputs($elements, $qtdeProducts)
{
    $productInputs = [];
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    for ($i = 0; $i < $qtdeProducts->length; $i++) {
        /**
         * @var int $k
         * @var DOMElement $element
         */
        $arrProducts = [];
        $loop = 0;
        foreach ($elements as $k => $element) {
            $class = $element->getAttribute('class');
            if (!in_array($class, $arrKeysList)) {
                unset($elements[$k]);
            } else {

                print_r($element);

                if ($loop >= sizeof($arrKeysList))
                    continue;

                $class = $element->getAttribute('class');
                $value = $element->getAttribute('value');

                $arrProducts[$loop] = [$class => $value];
                $loop++;

                /*foreach ($arrKeysList as $y => $kItem) {
                    if ($class === $kItem) {

                        $arrData[$y] = [$class => $value];
                        $arrProducts[$loop] = $arrData[$y];
                    }
                }*/

                //$productInputs[$i] = $arrProducts;
                //$loop++;
            }
        }

        $productInputs[$i] = $arrProducts;
    }

    print_r($productInputs);

    return $productInputs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )
/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @return array
 */
private function extractInfoByInputs($elements)
{
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    $arrayElements = [];
    for ($i = 0; $i < $elements->length; $i++) {
        $item = $elements->item($i);
        $class = $item->getAttribute('class');

        if (in_array($class, $arrKeysList))
            $arrayElements[] = $item;
    }

    $arrayAttrs = [];
    foreach ($arrKeysList as $y => $kItem) {
        $loop = 0;
        /**
         * @var int $k
         * @var DOMElement $element
         */
        foreach ($arrayElements as $k => $element) {
            $class = $element->getAttribute('class');
            $value = $element->getAttribute('value');

            if ($class === $kItem) {
                $arrayAttrs[$loop][$y] = [$class => $value];

                $loop++;
            }
        }
    }

    print_r($arrayAttrs);

    return $arrayAttrs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Listrada
                )

            [1] => Array
                (
                    [productId] => 03XZAMSE
                )

            [2] => Array
                (
                    [productPrice] => 59.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Tie Dye
                )

            [1] => Array
                (
                    [productId] => 03TBNCME
                )

            [2] => Array
                (
                    [productPrice] => 99.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

        etc...
Array
(
    [0] => Array
        (
            [productName] => Camisa Polo Masculina Flamê
            [productId] => 03MJRUXE
            [productPrice] => 69.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [1] => Array
        (
            [productName] => Camisa Polo Masculina Listrada
            [productId] => 03XZAMSE
            [productPrice] => 59.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [2] => Array
        (
            [productName] => Camisa Polo Masculina Tie Dye
            [productId] => 03TBNCME
            [productPrice] => 99.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [3] => Array
        (
            [productName] => Camisa Masculina Slim
            [productId] => H2EUSE01E
            [productPrice] => 119.99
            [productCategory] => Camisas
            [productBrand] => Business
        )

    [4] => Array
        (
            [productName] => Camiseta Masculina Alongada
            [productId] => 4E6QWBDE
            [productPrice] => 49.99
            [productCategory] => Camisetas
            [productBrand] => Business
        )

    [5] => ...
关于那些钥匙的一个观察 外循环中有许多键

实际上,它是按键分组的,但最好按输入名称/类和值分组

所以,稍微修改一下

  • 之前:

    $arrayAttrs[$loop][$y]=[$class=>$value]

  • 现在:

    $arrayAttrs[$loop][$class]=$value

。。。就这样!更好的产出如下:

/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @param DOMNodeList $qtdeProducts
 * @return array
 */
private function extractInfoByInputs($elements, $qtdeProducts)
{
    $productInputs = [];
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    for ($i = 0; $i < $qtdeProducts->length; $i++) {
        /**
         * @var int $k
         * @var DOMElement $element
         */
        $arrProducts = [];
        $loop = 0;
        foreach ($elements as $k => $element) {
            $class = $element->getAttribute('class');
            if (!in_array($class, $arrKeysList)) {
                unset($elements[$k]);
            } else {

                print_r($element);

                if ($loop >= sizeof($arrKeysList))
                    continue;

                $class = $element->getAttribute('class');
                $value = $element->getAttribute('value');

                $arrProducts[$loop] = [$class => $value];
                $loop++;

                /*foreach ($arrKeysList as $y => $kItem) {
                    if ($class === $kItem) {

                        $arrData[$y] = [$class => $value];
                        $arrProducts[$loop] = $arrData[$y];
                    }
                }*/

                //$productInputs[$i] = $arrProducts;
                //$loop++;
            }
        }

        $productInputs[$i] = $arrProducts;
    }

    print_r($productInputs);

    return $productInputs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )
/**
 * Extract info of the inputs.
 *
 * @param DOMNodeList $elements
 * @return array
 */
private function extractInfoByInputs($elements)
{
    $arrKeysList = [
        'productName',
        'productId',
        'productPrice',
        'productCategory',
        'productBrand'
    ];

    $arrayElements = [];
    for ($i = 0; $i < $elements->length; $i++) {
        $item = $elements->item($i);
        $class = $item->getAttribute('class');

        if (in_array($class, $arrKeysList))
            $arrayElements[] = $item;
    }

    $arrayAttrs = [];
    foreach ($arrKeysList as $y => $kItem) {
        $loop = 0;
        /**
         * @var int $k
         * @var DOMElement $element
         */
        foreach ($arrayElements as $k => $element) {
            $class = $element->getAttribute('class');
            $value = $element->getAttribute('value');

            if ($class === $kItem) {
                $arrayAttrs[$loop][$y] = [$class => $value];

                $loop++;
            }
        }
    }

    print_r($arrayAttrs);

    return $arrayAttrs;
}
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Flamê
                )

            [1] => Array
                (
                    [productId] => 03MJRUXE
                )

            [2] => Array
                (
                    [productPrice] => 69.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Listrada
                )

            [1] => Array
                (
                    [productId] => 03XZAMSE
                )

            [2] => Array
                (
                    [productPrice] => 59.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [productName] => Camisa Polo Masculina Tie Dye
                )

            [1] => Array
                (
                    [productId] => 03TBNCME
                )

            [2] => Array
                (
                    [productPrice] => 99.99
                )

            [3] => Array
                (
                    [productCategory] => Polos
                )

            [4] => Array
                (
                    [productBrand] => Business
                )

        )

        etc...
Array
(
    [0] => Array
        (
            [productName] => Camisa Polo Masculina Flamê
            [productId] => 03MJRUXE
            [productPrice] => 69.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [1] => Array
        (
            [productName] => Camisa Polo Masculina Listrada
            [productId] => 03XZAMSE
            [productPrice] => 59.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [2] => Array
        (
            [productName] => Camisa Polo Masculina Tie Dye
            [productId] => 03TBNCME
            [productPrice] => 99.99
            [productCategory] => Polos
            [productBrand] => Business
        )

    [3] => Array
        (
            [productName] => Camisa Masculina Slim
            [productId] => H2EUSE01E
            [productPrice] => 119.99
            [productCategory] => Camisas
            [productBrand] => Business
        )

    [4] => Array
        (
            [productName] => Camiseta Masculina Alongada
            [productId] => 4E6QWBDE
            [productPrice] => 49.99
            [productCategory] => Camisetas
            [productBrand] => Business
        )

    [5] => ...

我希望通过解决这个问题来帮助其他人。

显示更多的html文件(特别是显示几个带有父节点的产品);还有什么是正确的输出我现在就更新代码。谢谢你关心帮助我。