Как можно включить атрибуты XML в массив с синтаксисом xpath-подобного метода доступа?

Моя любимая функция 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, чтобы получить нужное количество без каких-либо раздражающих циклов for-each:

//sku[@o='1234']/warehouse[@o='ATX']/qty

Но я пытался отобразить этот точный тип синтаксиса без использования xpath, например, просто используя массивы PHP или что-то подобное. Неудачно.

Проблема в том, что это ломается, когда вы пытаетесь иметь более двух ключей (т. Е. Больше, чем порядковый ключ и семантический ключ), потому что тогда в цикле foreach вы будете перебирать элемент по дополнительному времени для каждого дополнительного ключа, если только вы не реализовать некоторую действительно раздражающую логику.

Кто-нибудь есть идеи, как вы могли бы сделать это в PHP без использования циклов xpath или foreach, но каким-то образом сделать это с помощью синтаксиса, например:

$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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]