PHP在没有xpath的foreach循环中取消设置对象数组元素
我需要取消设置对象中的所有PHP在没有xpath的foreach循环中取消设置对象数组元素,php,foreach,simplexml,unset,Php,Foreach,Simplexml,Unset,我需要取消设置对象中的所有payment元素,以便仅显示作为收款人的johndoe支付元素 代码部分工作。它只取消设置第一个付款元素 xpath适用于本例,但不适用于我的实际项目。那么,除了在Payee节点中取消设置没有johndoe的所有支付元素外,还有什么替代方法 对象: $data = ' <root> <orderArray> <order> <Payments> <Payment>
payment
元素,以便仅显示作为收款人的johndoe
支付元素
代码部分工作。它只取消设置第一个付款元素
xpath适用于本例,但不适用于我的实际项目。那么,除了在Payee
节点中取消设置没有johndoe
的所有支付元素外,还有什么替代方法
对象:
$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>
';
$data='1!'
成功
测试用户
成功
约翰多
成功
测试用户
成功
d_测试_用户
成功
约翰多
成功
测试用户
失败
测试用户
成功
约翰多
成功
i\u测试用户
';
守则:
$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();
$xml=simplexml\u load\u字符串($data);
$sellerID='johndoe';
foreach($xml->orderArray作为$order){
foreach($order->order as$val){
foreach($val->付款->以美元付款){
如果($payment->paye!=$sellerID){
未结算($payment[0]);
}
}
$asxml.=$val->asxml();
}
}
$xml=新的DomDocument('1.0','utf-8');
$xml->loadXML('.$asxml'.');
标题('content-type:text/xml');
echo$xml->saveXML();
经过大量实验后,首先创建一个要删除的付款列表,然后删除它们。这就停止了操作您当前迭代的数据的问题
同样在构建要删除的项目的循环中,它以相反的顺序构建列表,以便在尝试按位置删除项目时列表不会再次更改
$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();
$asxml=”“;
foreach($xml->orderArray作为$order){
foreach($order->order as$val){
$i=0;
$removeList=[];
foreach($val->付款->以美元付款){
如果($payment->paye!=$sellerID){
数组_unshift($removeList,$i);
}
$i++;
}
foreach($removeList作为$remove){
未设置($val->付款->付款[$remove]);
}
}
$asxml.=$order->order->asxml();
}
$xml=新的DomDocument('1.0','utf-8');
$xml->loadXML('.$asxml'.');
$xml->formatOutput=true;
echo$xml->saveXML();
我会尝试一下并让您知道。奈杰尔,我不确定这将如何工作,因为我从api响应中收集的不仅仅是收款人数据。我将如何将此信息与我正在收集的所有其他数据一起放回订单元素中?很抱歉延迟,但有一个问题是,每当有人得到答案时,有时似乎会有更多的信息。这会让人们感到沮丧,因为他们编写一些代码只是为了了解一些额外的隐藏需求。尝试并确保你们有一个明确的要求,希望这能解决你们前进过程中的许多延迟/删除的答案。我会尝试你们的新答案,并尽快和你们联系。谢谢你。