PHP не установленный объект в цикле foreach, $ key это имя вместо номера итерации - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно сбросить один из объектов платежей, но с помощью кода, который я использую, я не могу заставить его работать правильно, потому что $k - это не фактический ключ итерации, это имя объекта Payment.

Как получить числовой ключ итерации?

    // var_dump of object
    object(add_nodes)#14 (1) {
      ["Payments"]=>
      object(add_nodes)#15 (1) {
        ["Payment"]=>
        array(2) {
          [0]=>
          object(add_nodes)#18 (5) {
            ["PaymentStatus"]=>
            string(9) "Succeeded"
            ["Payer"]=>
            string(10) "podve"
            ["Payee"]=>
            string(11) "PitneyBowes"
            ["PaymentTime"]=>
            string(24) "2018-11-09T09:18:27.000Z"
            ["PaymentAmount"]=>
            string(5) "47.73"
          }
          [1]=>
          object(add_nodes)#19 (7) {
            ["PaymentStatus"]=>
            string(9) "Succeeded"
            ["Payer"]=>
            string(10) "podve"
            ["Payee"]=>
            string(14) "jannesmith"
            ["PaymentTime"]=>
            string(24) "2018-11-09T09:18:27.000Z"
            ["PaymentAmount"]=>
            string(6) "102.99"
            ["ReferenceID"]=>
            string(17) "09273450972340987534"
            ["FeeOrCreditAmount"]=>
            string(4) "4.21"
          }
        }
      }
    }

код:

    $xml = simplexml_load_string($response, 'add_nodes');       
    $payments = $obj->Payments;
    if(count($payments->Payment) > 1 ) {

        foreach($payments->Payment as $k => $v) {
            echo $k; // This = Payment, not 0 or 1
            if($v->Payee != 'jannesmith') {
                unset($payments->Payment[$k]);
            }
        }
    }

1 Ответ

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

Как альтернатива, я всегда был неравнодушен к DomDocument и XPath, поскольку это точно так же, как и обход DOM и манипулирование в JavaScript, Swift и т. Д. Вам не нужно изучать все хитрые тонкости зависящая от языка реализация, такая как SimpleXML.

$response = <<< XML
<?xml version="1.0"?>
<DocRoot>
<Payments>
    <Payment>
        <PaymentStatus>Succeeded</PaymentStatus>
        <Payer>podve</Payer>
        <Payee>Pitney Bowes</Payee>
        <PaymentTime>2018-11-09T09:18:27.000Z</PaymentTime>
        <PaymentAmount>47.73</PaymentAmount>
    </Payment>
    <Payment>
        <PaymentStatus>Succeeded</PaymentStatus>
        <Payer>podve</Payer>
        <Payee>jannesmith</Payee>
        <PaymentTime>2018-11-09T09:18:27.000Z</PaymentTime>
        <PaymentAmount>102.99</PaymentAmount>
        <ReferenceID>09273450972340987534</ReferenceID>
        <FeeOrCreditAmount>4.21</FeeOrCreditAmount>
    </Payment>
</Payments>
</DocRoot>
XML;

$doc = new DomDocument;
$doc->loadXML($response);
$xpath = new DomXPath($doc);
$nodes = $xpath->query("/DocRoot/Payments/Payment[not(./Payee='jannesmith')]");
foreach ($nodes as $node) $node->parentNode->removeChild($node);
echo $doc->saveXML();

Выход:

<?xml version="1.0"?>
<DocRoot>
<Payments>

    <Payment>
        <PaymentStatus>Succeeded</PaymentStatus>
        <Payer>podve</Payer>
        <Payee>jannesmith</Payee>
        <PaymentTime>2018-11-09T09:18:27.000Z</PaymentTime>
        <PaymentAmount>102.99</PaymentAmount>
        <ReferenceID>09273450972340987534</ReferenceID>
        <FeeOrCreditAmount>4.21</FeeOrCreditAmount>
    </Payment>
</Payments>
</DocRoot>
...