я собираюсь
недопустимый тип смещения
ошибка для каждой итерации этого кода. Вот код:
$s = array();
for($i = 0; $i < 20; $i++){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
print_r($s)
Ответы:
Ошибки недопустимого типа смещения возникают, когда вы пытаетесь получить доступ к индексу массива, используя объект или массив в качестве ключа индекса.
Пример:
$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type
Ваш $xmlмассив содержит объект или массив $xml->entry[$i]->sourceдля некоторого значения $i, и когда вы попытаетесь использовать это в качестве ключа индекса для $s, вы получите это предупреждение. Вам нужно будет убедиться, что он $xmlсодержит то, что вы хотите, и что вы получаете к нему правильный доступ.
$xmlпеременную с помощью какого-то анализатора XML? simple_xml или DOMDocument? В этом случае вполне вероятно, что исходный узел на самом деле является каким-то объектом элемента dom.
$xml->entry[$i]->source->div. Если вы хотите преобразовать HTML в структуру DOM, у вас DomDocumentесть loadHTML()функция, которая обрабатывает HTML намного лучше, чем SimpleXML. Проверьте php.net/manual/en/domdocument.loadhtml.php
Использовать trim($source)раньше $s[$source].
(string)$source), и результаты полностью зависят от его реализации __toString () . Это работает, если у вас есть SimpleXMLобъект (что-то, очевидно, предполагаемое всеми, но никогда не указанное в вопросе).
проверьте, что $ xml-> entry [$ i] существует и является объектом, прежде чем пытаться получить его свойство
if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
или $ source может быть не допустимым смещением массива, а массивом, объектом, ресурсом или, возможно, null
Вероятно, в вашем xml меньше 20 записей.
измените код на этот
for ($i=0;$i< sizeof($xml->entry); $i++)
...
У меня была аналогичная проблема. Поскольку я получил символ от моего ребенка XML, мне пришлось сначала преобразовать его в строку (или целое число, если вы этого ожидаете). Ниже показано, как я решил проблему.
foreach($xml->children() as $newInstr){
$iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
$arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
}
$sourceэто экземпляр,SimpleXMLи предоставляют информацию, которая применима только к этой конкретной ситуации. Хотя в конечном итоге так и произошло, вопрос не утверждал этого, и всякий, кто приходит сюда для справки, должен это учитывать.