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响应中收集的不仅仅是收款人数据。我将如何将此信息与我正在收集的所有其他数据一起放回
订单元素中?很抱歉延迟,但有一个问题是,每当有人得到答案时,有时似乎会有更多的信息。这会让人们感到沮丧,因为他们编写一些代码只是为了了解一些额外的隐藏需求。尝试并确保你们有一个明确的要求,希望这能解决你们前进过程中的许多延迟/删除的答案。我会尝试你们的新答案,并尽快和你们联系。谢谢你。