php-如何解决此非法偏移类型错误


89

我越来越

非法胶印类型

此代码每次迭代的错误。这是代码:

$s = array();
for($i = 0; $i < 20; $i++){
    $source = $xml->entry[$i]->source;
    $s[$source] += 1;    
}

print_r($s)

10
警告:几乎所有答案(“僵尸”除外)都假定$source是的一个实例,SimpleXML并提供仅适用于该特定情况的信息。虽然最终是这样,但问题并未说明,无论谁来这里进行参考,都应考虑到这一点。
阿尔瓦罗·冈萨雷斯

Answers:


156

当您尝试使用对象数组作为索引键访问数组索引时,会发生非法偏移类型错误。

例:

$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type

您的$xml数组包含一个对象或数组,其$xml->entry[$i]->source值为的某个值$i,当您尝试将其用作的索引键时$s,会收到警告。您必须确保$xml包含所需的内容并正确访问它。


源包含html,该类是否作为对象?
史蒂文

您是否$xml使用某种XML解析器创建了变量?simple_xml还是DOMDocument?在这种情况下,源节点实际上可能是某种dom元素对象。
zombat

我正在使用simplexml_load_string。有帮助吗?
史蒂文

您的HTML可能已解析为XML,并且很可能所有标签都变成了节点。例如,如果您有一个HTML片段“ <div> Hi </ div>”作为源属性,则可能会有类似的内容$xml->entry[$i]->source->div。如果要将HTML解析为DOM结构,则DomDocument具有一个loadHTML()处理HTML的功能比SimpleXML更好的功能。查看php.net/manual/en/domdocument.loadhtml.php
zombat

感谢那。我已经使用str_replace剥离了html,它可以工作。
史蒂文

26

trim($source)之前 使用$s[$source]


3
我认为这是对这个问题的正确答案,不说zombat的
PMPR

5
修剪对象只是将其转换为字符串的一种简单方法(直接的方法是(string)$source),结果完全取决于其__toString()实现。如果您有一个SimpleXML对象(似乎是每个人都假定但从未在问题中真正说明过的东西),它会起作用。
阿尔瓦罗·冈萨雷斯

如果这与__toString()实现有关,则调用trim()不是干净的解决方案。令人困惑。
迷彩

3

在尝试获取$ xml-> entry [$ i]的属性之前,检查它是否存在并且是一个对象

 if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
   $source = $xml->entry[$i]->source;          
   $s[$source] += 1;
 }

或$ source可能不是合法的数组偏移量,而是数组,对象,资源或可能为null


2
唯一正确的答案。您必须检查数组中元素的存在。如果它不存在,则无法访问它的属性。
RWC 2013年

0

您的xml中可能少于20个条目。

将代码更改为此

for ($i=0;$i< sizeof($xml->entry); $i++)
...

4
未定义的整数索引不会生成“非法偏移”警告,而是会收到“未定义的索引” E_NOTICE。
zombat'4

0

我有一个类似的问题。当我从XML子级获得一个Character时,我必须先将其转换为String(或者,如果需要,则转换为Integer)。以下显示了我如何解决该问题。

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.