I need to unset all of the payment
elements in the object so that only the payment elements that have johndoe
as the Payee will be displayed.
The code works partially. It unsets only the first payment element.
xpath works for this example, but not for my real world project. So, what is an alternative to unsetting all the payment elements that do not have johndoe
in the Payee
node?
The object:
$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>
';
The code:
$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();