php-この不正なオフセットタイプエラーを修正するにはどうすればよいですか


90

私は得ています

不正なオフセットタイプ

このコードの反復ごとにエラーが発生します。コードは次のとおりです。

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

print_r($s)

10
警告:ほとんどすべての回答(ゾンバットを除く)は、それ$sourceがのインスタンスであるSimpleXMLと想定し、その特定の状況にのみ適用される情報を提供します。それは最終的には事実でしたが、質問はそれを述べていませんでした、そして参照のためにここに来る人は誰でもこれを考慮に入れるべきです。
アルバロゴンサレス

回答:


157

オブジェクトまたは配列をインデックスキーとして使用して配列インデックスにアクセスしようとすると、不正なオフセットタイプエラーが発生します。

例:

$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 2010

simplexml_load_stringを使用しています。それは役に立ちますか?
スティーブン

HTMLがXMLとして解析された可能性があり、すべてのタグがノードになった可能性があります。たとえば、ソースプロパティとして「<div> Hi </ div>」のHTMLスニペットがある場合、おそらくのようなものがあり$xml->entry[$i]->source->divます。HTMLをDOM構造に解析する場合DomDocumentは、loadHTML()SimpleXMLよりもはるかに優れたHTMLを処理する関数があります。php.net/manual/en/domdocument.loadhtml.php
zombat

それをありがとう。str_replaceを使用してhtmlを削除しましたが、機能します。
スティーブン

26

trim($source)前に使用し $s[$source]ます。


3
これは、ゾンバットの
Pmpr 2015

5
オブジェクトのトリミングは、オブジェクトを文字列にキャストするための非自明な方法であり(簡単な方法です(string)$source)、結果はその__toString()の実装に完全に依存します。SimpleXMLオブジェクトがある場合に機能します(明らかに誰もが想定しているものですが、質問で実際に述べられたことはありません)。
アルバロゴンサレス

これが問題である場合は、__ toString()の実装に関連しており、trim()の呼び出しはクリーンな解決策ではありません。それは紛らわしい。
CAMO

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

0

xmlにはおそらく20未満のエントリがあります。

コードをこれに変更します

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

4
未定義の整数インデックスは「不正なオフセット」警告を生成しません。代わりに「未定義のインデックス」E_NOTICEを受け取ります。
zombat 2010

0

私も同様の問題を抱えていました。XMLの子から文字を取得したので、最初にそれを文字列(または必要に応じて整数)に変換する必要がありました。以下に、私がどのように問題を解決したかを示します。

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.