php - foreach 循环中的 PHP 未设置对象,$key 是名称而不是迭代次数
问题描述
我需要取消设置其中一个支付对象,但是使用我正在使用的代码,我无法让它正常工作,因为$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]);
}
}
}
解决方案
作为替代方案,我一直偏爱 DomDocument 和 XPath,因为它与在 JavaScript、Swift 等中进行 DOM 遍历和操作完全相同。您不需要学习特定语言的所有棘手复杂性像 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>
推荐阅读
- string - 嵌入字符串中的 Goto 函数
- python - 模拟导入模块时调用的函数
- javascript - JavaScript 在用户输入后清除文本区域
- powershell - From PowerShell Get Refresh History In Group from Power BI REST APIs and export do CSV
- ansible - 具有多个子项且没有变量合并的 Ansible Inventory
- javascript - CORS:Access-Control-Allow-Origin 在 Node.js 中不起作用
- python-3.x - 在 linux 中编辑大 pcap 时性能缓慢
- ios - 聚焦时如何修复 UISearchController 搜索栏调整大小?
- python-3.x - 使用 ax.annotate 时如何适合行尾标签?
- algorithm - 对象到对象/值到值的存储和查找