Я отримую
незаконний офсетний тип
помилка для кожної ітерації цього коду. Ось код:
$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-> запис [$ i] існує та є об'єктом перед спробою отримати його властивість
if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
$source = $xml->entry[$i]->source;
$s[$source] += 1;
}
або $ source може бути не юридичним зміщенням масиву, а масивом, об’єктом, ресурсом або, можливо, нульовим значенням
Можливо, у вашому 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
і надають інформацію, яка стосується лише тієї конкретної ситуації. Хоча це врешті-решт було так, питання не містило цього, і той, хто приходить сюди для довідки, повинен це врахувати.