2012-01-05 3 views
1

В следующем объекте SimpleXMLElement $results, я хотел бы удалить элемент с ID 13011146 из массива TEST. Я не уверен, как правильно получить доступ к ключу массива со значением 1, поэтому я использую счетчик $i, но это дает мне ошибку Node no longer exists, указывая на линию foreach.PHP Доступ к элементам массива SimpleXMLElement Object

TL; DR: Как вы отменили $result->TEST[1]?

SimpleXMLElement Object 
(
    [TEST] => Array 
     (
      [0] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [ID] => 13011145 
         ) 

       ) 

      [1] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [ID] => 13011146 
         ) 

       ) 
     ) 

) 

PHP:

$i = 0; 
foreach($results->TEST as $key => $value) { 
    if((string)$value['ID'] == 13011146) { 
     unset($results->TEST[$i]); 
    } 
    $i++; 
} 
+0

вы можете обеспечить 'XML' для основной' SimpleXMLElement Object' – maxjackie

ответ

0
foreach($results->TEST->children() as $key => $value) { 
    $attributes = $value->attributes(); 
    foreach($attributes as $a => $b) { 
     if (((string)$a == 'ID') && ((string)$b == '13011146')) {  
      unset($results->TEST[$key]);  
     } 
    } 
} 
+0

Не работает, по какой-то причине $ ключ == TEST – stef

+0

К сожалению, неправильно структуру: Должен быть фиксированной по вызову children() - см. отредактированную версию –

+0

Теперь мы даже не входим в первый цикл foreach: s Если я удалю child(), тогда будет найдено совпадение, если найдено для $ a и $ b, но снова значение $ key неправильно. – stef

0

попробовать этот

$node = $results->children(); 
unset($node[1]); 
0

более элегантный способ; это дает те же результаты без использования $ атрибутов [ '@attributes']:

$attributes = current($element->attributes()); 

Для конкретной пары ключа/значения, мы можем использовать как:

$attributes = current($value->attributes()->NAME); 

Надеется, что это помогает!

0

Попробуйте это:

$sxe = new SimpleXMLElement($xml); 
    foreach ($sxe->children() as $child){ 
     foreach($child as $key=>$item){ 
     echo $key.': '.$item.'<br />'; 
     } 
    } 
Смежные вопросы