【问题标题】:php - How do I fix this illegal offset type errorphp - 如何修复此非法偏移类型错误
【发布时间】:2011-02-13 12:25:08
【问题描述】:

我来了

非法偏移类型

此代码的每次迭代都会出错。这是代码:

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

print_r($s)

【问题讨论】:

  • 警告:几乎所有答案(除了 zombat 的)都假设$sourceSimpleXML 的一个实例,并提供仅适用于该特定情况的信息。虽然最终情况如此,但问题并没有说明,任何来这里参考的人都应该考虑到这一点。

标签: php arrays


【解决方案1】:
当您尝试使用 objectarray 作为索引键访问数组索引时,会发生

非法偏移类型错误。 p>

例子:

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

您的$xml 数组在$xml-&gt;entry[$i]-&gt;source 包含一个对象或数组,其值为$i,当您尝试将其用作$s 的索引键时,您会收到该警告。您必须确保 $xml 包含您想要的内容并且您可以正确访问它。

【讨论】:

  • 源包含html,该类是否作为对象?
  • 您是否使用某种 XML 解析器创建了 $xml 变量? simple_xml 或 DOMDocument?在这种情况下,源节点很可能实际上是某种 dom 元素对象。
  • 我正在使用 simplexml_load_string。这有帮助吗?
  • 您的 HTML 可能已被解析为 XML,并且您的所有标签都可能成为节点。例如,如果您有一个“
    Hi
    ”的 HTML sn-p 作为源属性,那么您可能会得到类似 $xml-&gt;entry[$i]-&gt;source-&gt;div 的内容。如果你想将 HTML 解析成 DOM 结构,DomDocument 有一个 loadHTML() 函数,它处理 HTML 比 SimpleXML 好得多。查看php.net/manual/en/domdocument.loadhtml.php
  • 谢谢。我已经使用 str_replace 来剥离 html 并且它可以工作。
【解决方案2】:

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

【讨论】:

  • 我认为这是这个问题的正确答案,而不是that of zombat
  • 修剪对象只是将其转换为字符串的一种不明显的方法(直接的方法是(string)$source),结果完全取决于它的__toString() 实现。如果您有一个 SimpleXML 对象(显然是每个人都假设但从未在问题中真正说明的东西),它会起作用。
  • 如果这是与 __toString() 实现有关的问题,则调用 trim() 不是干净的解决方案。令人困惑。
  • 您也可以尝试gettype($source),它可能会按预期返回object 而不是stringnumber
【解决方案3】:

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

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

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

【讨论】:

  • 唯一正确的答案。您必须检查数组中元素的存在。如果它不存在,则无法访问它的属性。
【解决方案4】:

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

把代码改成这个

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

【讨论】:

  • 未定义的整数索引不会生成“非法偏移”警告,而是会收到“未定义的索引”E_NOTICE。
【解决方案5】:

我遇到了类似的问题。当我从我的 XML 孩子那里得到一个字符时,我必须首先将它转换为字符串(或整数,如果你期望的话)。下面展示了我是如何解决这个问题的。

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2020-07-29
    • 2011-01-12
    相关资源
    最近更新 更多