PHP Unset объект массива элементов в цикле foreach без xpath - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно сбросить все элементы 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 Ответ

0 голосов
/ 10 ноября 2018

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

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

$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();
...