使用类似xpath的访问器语法将XML属性合并到数组中的方法是什么?

时间:2014-11-21 23:15:19

标签: php hashtable

到目前为止,我最喜欢的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

0 个答案:

没有答案