сбросить конкретный c узел внутри цикла foreach - PullRequest
0 голосов
/ 05 августа 2020

Я здесь полностью застрял.

У меня простая структура xml в PHP

<InvoiceLines>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">4867895346</ProductIdentifier>
        <ProductName>a name</ProductName>
        <ProductUnitPrice type="net">75</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <Dimension>
            <DimensionName>Kustannuspaikka</DimensionName>
            <DimensionItem>110 Tukkukauppa kotimaa</DimensionItem>
        </Dimension>
    </SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">1345573456</ProductIdentifier>
        <ProductName>name</ProductName>
        <ProductUnitPrice type="net">31</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <Dimension>
            <DimensionName>Kustannuspaikka</DimensionName>
            <DimensionItem>150</DimensionItem>
        </Dimension>
    </SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">Shipping_cost</ProductIdentifier>
        <ProductName>Shipping</ProductName>
        <ProductUnitPrice type="net">0</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <SalesInvoiceProductLineDiscountPercentage>0</SalesInvoiceProductLineDiscountPercentage>
    </SalesInvoiceProductLine>
</InvoiceLine>

Мне нужно удалить InvoiceLine с помощью Стоимость доставки. Я много пробовал (просто посчитав все это, удалите последние, разные подходы с помощью xPath et c.)

Мой код на данный момент

//remove shipping lines, always 0 and not needed
foreach ($base->SalesInvoice->InvoiceLines->InvoiceLine as $key => $invoiceline) {
  if ($invoiceline->SalesInvoiceProductLine->ProductIdentifier == "Shipping_cost") {
echo "shipping cost FOUND \n";
echo "\n";
var_dump($key);
echo "\n";
    unset($base->SalesInvoice->InvoiceLines->InvoiceLine[$key]);
  }
}

Я не могу обдумай это. Он находит стоимость доставки, но не может заставить работать расстановку. Переменная $ key содержит только строку (11) «InvoiceLine». Я перепробовал еще много подходов, но ни один из них не нашел нужного элемента.

Если есть какая-либо информация, пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Вы можете сохранить индекс InvoiceLine и удалить его из массива base-> InvoiceLine в конце. Я немного изменил ваш код для работы в моей системе.

<!DOCTYPE html>
<html>
<body>

<?php
$myXMLData =
'<InvoiceLines>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">4867895346</ProductIdentifier>
        <ProductName>a name</ProductName>
        <ProductUnitPrice type="net">75</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <Dimension>
            <DimensionName>Kustannuspaikka</DimensionName>
            <DimensionItem>110 Tukkukauppa kotimaa</DimensionItem>
        </Dimension>
    </SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">1345573456</ProductIdentifier>
        <ProductName>name</ProductName>
        <ProductUnitPrice type="net">31</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <Dimension>
            <DimensionName>Kustannuspaikka</DimensionName>
            <DimensionItem>150</DimensionItem>
        </Dimension>
    </SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">Shipping_cost</ProductIdentifier>
        <ProductName>Shipping</ProductName>
        <ProductUnitPrice type="net">0</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <SalesInvoiceProductLineDiscountPercentage>0</SalesInvoiceProductLineDiscountPercentage>
    </SalesInvoiceProductLine>
</InvoiceLine>
<InvoiceLine>
    <SalesInvoiceProductLine>
        <ProductIdentifier type="customer">222222222</ProductIdentifier>
        <ProductName>name</ProductName>
        <ProductUnitPrice type="net">31</ProductUnitPrice>
        <ProductVatPercentage vatcode="KOMY">24</ProductVatPercentage>
        <SalesInvoiceProductLineQuantity>1</SalesInvoiceProductLineQuantity>
        <Dimension>
            <DimensionName>Kustannuspaikka</DimensionName>
            <DimensionItem>150</DimensionItem>
        </Dimension>
    </SalesInvoiceProductLine>
</InvoiceLine>
</InvoiceLines>';

$base=simplexml_load_string($myXMLData);
print_r($base);
echo "<br>------------------------<br>";
$indexes = array();
$i = 0;
//remove shipping lines, always 0 and not needed
foreach ($base->InvoiceLine as $key) {
    echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";
    
    if ($key->SalesInvoiceProductLine->ProductIdentifier == "Shipping_cost") {
        echo "shipping cost FOUND \n";
        echo "\n";
        var_dump($key);
        echo "\n";
        array_push($indexes, $i);
    }
    
    $i++;
}

foreach($indexes as $index) {
    unset($base->InvoiceLine[$index]);
}

echo "<br>------------------------<br>";
print_r($base);
echo "<br>------------------------<br>";
foreach ($base->InvoiceLine as $key) {
    echo "***".$key->SalesInvoiceProductLine->ProductIdentifier."==="."<br>";    
}
?>

</body>
</html>

0 голосов
/ 05 августа 2020

Поскольку вы имеете дело с xml, вам, вероятно, лучше использовать xpath. Что-то вроде:

dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$targets = $xpath->query('//ProductIdentifier[text()="Shipping_cost"]');

foreach ($targets as $target) {
    $target->parentNode->removeChild($target);
}

echo $dom->saveXML();

Это должно дать вам правильный результат.

...