2015-05-08 4 views
0

У меня есть массив с именем $ child, который содержит хотя бы слова. Я хочу перебрать массив и сохранить каждое слово в отдельной переменной. В настоящее время я пробовал:Сохранение каждого слова в массиве в переменную

for($i = 0; $i < $child->count();$i++) 
     { 
    $var1 = (string) $child[$i]->xpath; 
    $var2 = (string) $child[$i+1]->xpath; 
    $var3 = (string) $child[$i+2]->xpath; 

} 

Это дает ошибку, говоря, что я пытаюсь получить свойство не-объекта. Это также не очень общее, если в массиве есть случай с большим количеством слов.

Любые предложения были бы очень признательны.

Извините, я ошибся, это не массив слов. В основном у меня есть объект SimpleXMLElement, называемый $ operation. Объект SimpleXMLElement ([@attributes] => Array ([type] => и) [child] => Array ([0] => SimpleXMLElement Object ([xpath] => noNotification [assert] => существует) [1] = > Объект SimpleXMLElement ([xpath] => sequence [assert] => not exists) [2] => Объект SimpleXMLElement ([xpath] => dataType/enumRef [@name = 'OperState]] [assert] => существует)))

Я хочу извлечь noNotification, sequence и dataType/enumRef [@name = 'OperState] из этого и сохранить их в отдельных переменных. Однако я не могу просто просто их напрямую связать, поскольку это нужно делать динамически, если другие элементы будут добавлены на более позднем этапе.

+1

Не могли бы вы показать нам структуру '$ child'? Вы используете его как объект, но это массив. Я рекомендую взглянуть на документ PHP о [Массивы] (http://php.net/manual/en/language.types.array.php) и [Объекты] (http://php.net/manual/en/ language.types.object.php). Плюс код, который вы здесь показываете, не может дать никакой ошибки, он даже не запустится. ('$ i $ child-> count();'?) –

+1

Извините, я ошибся, это не массив слов. В основном у меня есть объект SimpleXMLElement, называемый $ operation. Объект SimpleXMLElement ([@attributes] => Array ([type] => и) [child] => Array ([0] => SimpleXMLElement Object ([xpath] => noNotification [assert] => существует) [1] = > Объект SimpleXMLElement ([xpath] => sequence [assert] => not exists) [2] => Объект SimpleXMLElement ([xpath] => dataType/enumRef [@name = 'OperState]] [assert] => существует))) – user3046825

+0

(Было бы лучше, если бы вы отредактировали свой вопрос с этой информацией.;)) –

ответ

2

Во-первых, в вашем коде отсутствует символ <. Это должно быть так;

for($i = 0; $i < $child->count(); $i++) { 
    $var1 = (string) $child[$i]->xpath; 
    $var2 = (string) $child[$i+1]->xpath; 
    $var3 = (string) $child[$i+2]->xpath; 
} 

Теперь вернемся к коду

Вы будете испытывать проблемы с этим кодом, потому что вы не проверять, если $child[$i+1] фактически установлен или нет. $i может достигать максимальной длины $child, и он все равно попытается получить следующие 2 элемента. Таким образом, вы закончите с этой ошибкой trying to get a property of a non-object

Если вы пойдете с таким подходом, вы должны сделать это, по крайней мере, так;

for($i = 0; $i < $child->count(); $i++) { 
    $var1 = (string) $child[$i]->xpath; 
    if (isset($child[$i+1]->xpath)) $var2 = (string) $child[$i+1]->xpath; 
    if (isset($child[$i+2]->xpath)) $var3 = (string) $child[$i+2]->xpath; 
} 

Чтобы предоставить Вам больше и лучше ответ, мы должны знать структуру $child.

Так или иначе, это очень плохая практика. Учти это;

$child = array("test1","test2","test3","test4","test5","test6"); 
for($i = 0; $i < count($child); $i++){ 
    echo $child[$i]."<br />"; 
    if (isset($child[$i+1])) echo $child[$i+1]."<br />"; 
    if (isset($child[$i+2])) echo $child[$i+2]."<br />"; 
} 

Вы получите дубликаты. Поскольку сам цикл проходит через следующий элемент, и внутри цикла вы продолжаете движение еще 2 элемента.

Edit (после просмотра структуры)

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

$words = array(); 
for($i = 0; $i < count($operation->child); $i++) { 
    if (isset($operation->child[$i]->xpath)) { 
     $words[$i] = (string) $operation->child[$i]->xpath; 
    } 
} 
+0

Как этот код разрешит «пытаться получить свойство ошибки, отличной от объекта»? –

+0

@caCtus, вы должны хотя бы прочитать мой комментарий перед голосованием, возможно,? Я добавил дополнительное предложение, чтобы было более понятно, почему он может это сделать. –

+0

Какой комментарий? Возможно, я пропустил это. –

-2

В коде содержится несколько ошибок.

Прежде всего массивов должен быть проанализирован с foreach

Имея это в виду:

foreach($child as $key => $value) { 
    ${'word' . $key} = $value; 
} 

Теперь вы можете использовать переменные, начиная с $ word0.

EDIT: на основе ваших комментариев:

$myArray = array(); 
foreach($child as $key => $value) { 
    $myArray[$key] = array(
     'xpath' => (string)$value->xpath, 
     'assert' => (string)$value-> assert, 
    ); 
} 

Как вы можете иметь много переменных, что лучше сохранить данные в массив, а также.

попробуйте print_r($myArray) после foreach чтобы увидеть его содержимое.

+0

Что именно не так с использованием 'for'? (Кроме того, я не думаю, что вы имеете в виду «разобранный»). –

Смежные вопросы