Заставить узел SimpleXML всегда быть массивом, даже если в нем всего 1 элемент - PullRequest
1 голос
/ 19 августа 2011

Допустим, я хочу, чтобы у Места был список телефонных номеров. В некоторых местах будет 1 номер телефона, а в некоторых - более одного. У других его вообще не будет.

Проблема в том, что это:

$xml->addChild('phone_number','555.555.5555');

создает не повторяемый текстовый узел phone_number:

$response->xml->phone_number;

Но это:

$xml->addChild('phone_number','555.555.5555');
$xml->addChild('phone_number','555.555.5556');

создает итеративный массив phone_number:

$response->xml->phone_number[0];
$response->xml->phone_number[1];

Это накладывает ненужное бремя на клиента. Они должны определить, является ли результат повторяющимся или нет, и соответствующим образом изменить свой код.

Было бы НАМНОГО лучше, если бы я всегда мог отправить обратно целочисленный массив, даже если бы в нем было 0 или 1 элемент ... но я не смог найти никакой документации о том, как это сделать. Я считаю, что в Perl он называется «forcearray», но я не нашел эквивалента для PHP, который мне нужен.

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Только не используйте этот причудливый, волшебный интерфейс ($obj->xml->phone_number[x]) и используйте SimpleXMLElement::children() метод , который всегда возвращает повторяемый объект.

2 голосов
/ 19 августа 2011

вы должны учитывать это

<phone_numbers>
  <phone_number>555.555.5555</phone_number>
</phone_numbers>

это более гибкий

помимо метода children(), вы также можете рассмотреть xpath
,всегда возвращает массив для возврата

пример

$xml = <<<XML
<person>
  <phone_numbers>
    <phone_number>555.555.5555</phone_number>
  </phone_numbers>
</person>
XML;

$obj  = simplexml_load_string($xml);
$tels = $obj->xpath("//phone_numbers/*");

/* even more simple */
$tels = $obj->phone_numbers->children();
...