2013-08-04 4 views
0

Я довольно новичок в PHP XML и надеюсь, что вы можете мне помочь в этом. Поиск на форуме не помог мне найти ответ на мою конкретную проблему.PHP: получить конкретное значение из массива simplexml

У меня есть PHP страницу с массивом SimpleXML, который выглядит следующим образом, просто больше:

SimpleXMLElement Object 
    ( 
     [textID] => Array 
       ( 
        [0] => SimpleXMLElement Object 
         ( 
          [textID] => 1 
          [content] => Text1 
         ) 
        [1] => SimpleXMLElement Object 
         ( 
          [textID] => 2 
          [content] => Text2 
         ) 
        [2] => SimpleXMLElement Object 
         ( 
          [textID] => 3 
          [content] => Text3 
         ) 
       ) 
    ) 

Теперь я пытаюсь повторить из определенного значения из этого массива, ссылаясь на его идентификатор, который является целое число. Единственный способ, которым я получить эту работу заключается в следующем, но это только идет по порядку в пределах массива, а не фактическим ID:

<?php echo $objTexts->textID[1]->content; ?> 

Может кто-нибудь сказать мне, что я здесь отсутствует?

Спасибо, Тим

+0

Я не уверен, что вы пытаетесь достичь здесь? Вы хотите напрямую искать значение textID без вызова массива textID? –

+0

Вот пример: Мой код выше имеет число 1 в квадратных скобках. Это дает мне контент из второго textID в моем массиве. Фактическое значение textID для этого равно 2, поэтому я хотел бы назвать это, обратившись к его значению 2 вместо его позиции 1. – user2571510

+0

Обновление: я получил его работу со следующим подходом: это, вероятно, не лучший способ его записи но он работает. Если у кого-то есть предложение о том, как я могу улучшить или сократить это, пожалуйста, дайте мне знать. textID как $ item) {if ((string) $ item-> textID == "2") {echo (string) $ item-> content;}}?> Спасибо, Tim – user2571510

ответ

1

SimpleXML не имеет возможности узнать, что textID определяет, какой узел, который - это просто еще один элемент в XML.

Основываясь на вашем образце вывода, ваш XML немного запутан, так как у вас есть несколько элементов с именем textID, каждый из которых имеет один дочерний элемент, также называемый textID, который имеет другое значение. Тем не менее, то, что вы хотите сделать, может быть достигнуто либо путем зацикливания через все внешние textID элементов и проверки значения их внутреннего textID элемента:

foreach ($objTexts->textID as $item) 
{ 
    if ($item->textID == '2') 
    { 
      ... 
    } 
} 

Или, вы можете использовать XPath, который является довольно простым языком запросов для XML и поддерживается в SimpleXML в виде the ->xpath() method. В вашем случае, вы хотите найти textID узел, который содержит textID ребенка с определенным значением, так что код будет выглядеть примерно так:

// ->xpath always returns a plain PHP array - not a SimpleXML object 
$xpath_results = $objTexts->xpath('//textID[textID=2]'); 

// If you're certain you only want the first result: 
echo $xpath_results[0]->content; 

// If you might want multiple matches 
foreach ($xpath_results as $item) 
{ 
    ... 
} 
Смежные вопросы