到目前为止,我最喜欢的XML功能是属性语法,因为它可以让您执行以下操作:
<order>
<sku o="1234">
<warehouse o="PDX">
<qty>2</qty>
</warehouse>
<warehouse o="ATX">
<qty>4</qty>
</warehouse>
</sku>
<sku o="2345">
<warehouse o="PHX">
<qty>5</qty>
</warehouse>
<warehouse o="LAX">
<qty>5</qty>
</warehouse>
</sku>
</order>
然后你可以使用这个漂亮的xpath语法来获得特定数量的权限,而不会为每个循环做任何恼人的事情:
//sku[@o='1234']/warehouse[@o='ATX']/qty
但我一直试图在不使用xpath的情况下映射这种确切类型的语法,例如,仅使用PHP数组等。没运气。
问题是,当你试图拥有两个以上的键(即比序数键和语义键更多)时会出现故障,因为在foreach循环中,你会在每个项目中迭代一个额外的时间。额外的密钥,除非你实现一些非常烦人的逻辑。
有没有人知道如何在不使用xpath或foreach循环的情况下在PHP中执行此操作,但不知何故使用以下语法执行此操作:
$order['sku'=>'1234']['warehouse'=>'PDX']['qty']
...
我能想到的最接近的是这样的,虽然这感觉很糟糕:
function addToHashMap($array, $key, $value) {
array_unshift($array,$value);
$link = &$array[0];
$array[$key] = &$link;
return $array;
}
$order = array();
$order['skus'] = array();
$skus = &$order['skus'];
print_r($order);
print_r($skus);
$skus = addToHashMap($skus,'1234',array('qty'=>'1'));
$skus['1234']['qty'] += 1;
print_r($order);
foreach($skus as $key => $item) {
if($key < count($skus)/2) continue;
echo("qty: ".$item['qty']);
}
返回:
Array
(
[skus] => Array
(
)
)
Array
(
)
Array
(
[skus] => Array
(
[0] => Array
(
[qty] => 2
)
[1234] => Array
(
[qty] => 2
)
)
)
qty: 2