PHP Unset объект массива элементов в цикле foreach без xpath

Мне нужно сбросить все payment элементы в объекте, так что только элементы оплаты, которые имеют johndoe как получатель будет отображаться.

Код работает частично. Сбрасывает только первый платежный элемент.

xpath работает для этого примера, но не для моего реального проекта. Итак, что является альтернативой отмене сброса всех платежных элементов, которые не имеют johndoe в Payee узел?

Предмет:

$data = '
<root>
<orderArray>
<order>
<Payments>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">a_test_user</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">johndoe</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">c_test_user</Payee>
</Payment>
</Payments>
</order>
</orderArray>
<orderArray>
<order>
<Payments>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">d_test_user</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">johndoe</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">f_test_user</Payee>
</Payment>
</Payments>
</order>
<order>
<Payments>
<Payment>
<PaymentStatus>failed</PaymentStatus>
<Payee type="User">g_test_user</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">johndoe</Payee>
</Payment>
<Payment>
<PaymentStatus>Succeeded</PaymentStatus>
<Payee type="User">i_test_user</Payee>
</Payment>
</Payments>
</order>
</orderArray>
</root>
';

Код:

$xml = simplexml_load_string($data);

$sellerID = 'johndoe';

foreach($xml->orderArray as $order) {

foreach($order->order as $val) {

foreach ( $val->Payments->Payment as $payment )   {

if($payment->Payee != $sellerID) {

unset($payment[0]);

}
}

$asxml .= $val->asXML();

}
}


$xml = new DomDocument('1.0', 'utf-8');
$xml->loadXML('<Root>' . $asxml . '</Root>');

header('content-type: text/xml');
echo $xml->saveXML();

-1

Решение

После долгих экспериментов сначала создается список платежей, которые вы хотите удалить, а затем удаляет их. Это останавливает проблему манипулирования данными, над которыми вы сейчас работаете.

Также в цикле, который создает элементы для удаления, он создает список в обратном порядке, чтобы список снова не менялся при попытке удалить объекты по позиции …

$asxml = "";
foreach($xml->orderArray as $order) {
foreach($order->order as $val) {
$i = 0;
$removeList = [];
foreach ( $val->Payments->Payment as $payment )   {
if($payment->Payee != $sellerID) {
array_unshift( $removeList, $i);
}
$i++;
}
foreach ( $removeList as $remove )  {
unset($val->Payments->Payment[$remove]);
}
}
$asxml.= $order->order->asXML();
}

$xml = new DomDocument('1.0', 'utf-8');
$xml->loadXML('<Root>' . $asxml . '</Root>');
$xml->formatOutput = true;

echo $xml->saveXML();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector