Neo Inspiration

Avatar

中の人:jakkrokk (HN統一しました) がphp,javascript,air,flex などなど好き勝手書いてます。仕事は主にWEBシステムの設計と開発、SEO全般など。

phpでcannot use string offset as an arrayエラー

Yahooの商品検索Apiの php serialized を使っていたら 「cannot use string offset as an array」
とかいう見たこともないエラーが出たので対応メモ。

エラーが出るコードはこんなかんじ

//めんどくさいので取得の部分はぶきますが
//Yahoo APIで phpのserializedデータを取得
$unserializedData = unserialize(file_get_contents('http://shopping.yahooapis.jp/ShoppingWebService/V1/php/itemSearch?'));

foreach ($unserializedData['ResultSet'][0]['Result'] as $k=>$v) {
    print($v['Image']['Medium']); //これがPHP5だとエラーになる4だとOK
}

肝心のYahooの商品検索Apiのリターンはこんなかんじ(適当にはしょってます)

[ResultSet] => Array
        (
            [totalResultsAvailable] => Integer
            [totalResultsReturned] => Integer
            [firstResultPosition] => Integer
            [0] => Array
                (
                    [Result] => Array
                        (
                            [Request] => Array
                                (
                                    [Query] => String
                                )

                            [Modules] =>  String
                            [0] => Array
                                (
                                    [Name] => String
                                    [Description] => String
                                    [Headline] => String
                                    [Url] => String
                                    [Availability] => String
                                    [Code] => String
                                    [PersonId] => String
                                    [ProductId] => String
                                    [Image] => Array
                                        (
                                            [Id] => String
                                            [Small] => String
                                            [Medium] => String
                                        )
                                )
原因

エラー内容はStringなのにオフセットに配列つかうんじゃねえ
つまり文字列を対象に3次元配列としてアクセスしちゃうとPHP4ではなんもしないもに
PHP5ではエラーになっちゃうってことですね。
ようは ResultSet->0->Result でループをぶん回すと (Array)Request とか (String)Modules
とかがまざっちゃうわけですねハイ。
おそらくこのゴミも全部foreachかけてるのが原因ぽい。

一応ぐぐったらこんなのも出てきた。
https://www.zend.com/forums/index.php?t=msg&th=1556&S=c38b4b1a45a1dfba92db79dd967cc302

つまるとここういうこと
$array['hoge'] = "nemu";

print($array['hoge'][1]);
//e が表示される

print($array['hoge'][1][1]);
//PHP4だと何も表示されない
//PHP5だとcannot use string offset as an array
対応策

issetなりis_arrayなりで$v['Image']がある配列だけ作業するようにするのが
一番無難かな。

$unserializedData = unserialize(file_get_contents('http://shopping.yahooapis.jp/ShoppingWebService/V1/php/itemSearch?'));

foreach ($unserializedData['ResultSet'][0]['Result'] as $k=>$v) {
    if (is_array($v['Image'])) {
        print($v['Image']['Medium']);
    }
}
結局

配列とハッシュをごちゃごちゃにまとめるんじゃねえってかんじかな。。
せめて

[Result] => Array
    (
        [Request] => Array
            (
                [Query] => String
            )

        [Modules] =>  String
        [resultData] => Array (
                                [0] => array
                                [1] => array
                              )

こうしてほしいな。
絶対みんなここをforeachすんだから無駄な情報は移動しておいてほしいわ。。。

YahooのLink:

ツールを作っていて、YahooのLink:を全部出すことになったんですが、
これが意外とやっかいで。

普通にやると1000でストップ。
もちろんページングを1000以上にしても1000のデータしかでないわけで、
じゃあAPIはどうだーっていってもAPIも同じ。

で、色々と最近知り合いになれたSEOの本物のプロの方に聞いたら
本来手作業でやってるやりかたを教えてくれて、
(自分でも近いやり方は思いついたんだけど、ちょっとずれてたなぁ)
なんとか上手くとれました。
やっぱプロのSEO研究者は違う。

一応その方に見せたらほぼ誤差がないっておっしゃっていただけたので、
満足満足。

—-

まあ、その普段見ることのできないバックリンクとかみてると
ほんと ダークな世界だな~とにやにやしちゃいますねw
どんなにホワイトだ、ダークだいっても結局こうなんだなーと思いました。

バックリンクを1000件以上調査するなんて、
それこそプロユースというかプロオンリーのツールなので、
公開はしませんが、
まあほしいなら10万くらいで売りますかw イラナイナ。

GoogleはそもそもLink:で10万も20万も出ないから必要ないんだけど
Yahooは普通に64万とか出てくるから
全調査するのならツールは必須だと思うんですが、
これあんまりできてる人がいないラシイ?と聞いたのが意外でした。

Yahoo Google でリスティングとSEOで切り分ける

リファラでさっくり簡単かなーって思ったけどそうでもなかった・・

Googleだと
検索結果URL: http://www.google.co.jp/search?hl=ja&rlz=***&q=***&btnG=***&lr=

PPCリンクをクリック

PPCのURL先: http://www.google.co.jp/aclk?sa=l&ai=***
そのときの
 リファラ: http://www.google.co.jp/search?hl=ja&rlz=***&q=***&btnG=***&lr=
 ステータスコード: HTTP/1.x 302 Found
 転送先: http://www.googleadservices.com/pagead/aclk?sa=***

転送されてきたURL:http://www.googleadservices.com/pagead/aclk?sa=L&ai=***
そのときの
 リファラ: http://www.google.co.jp/search?hl=ja&rlz=***&q=***&btnG=***&lr=
 ステータスコード: HTTP/1.x 302 Found
 転送先: http://PPCの対象URL

さらに転送されてきて:http://PPCの対象URL
そのときの
 リファラ: http://www.google.co.jp/search?hl=ja&rlz=***&q=***&btnG=***&lr=
Yahooだと
検索結果URL: http://search.yahoo.co.jp/search?p=***&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8

PPCリンクをクリック
↓

PPCのURL先: http://wrs.search.yahoo.co.jp/S=***/K=***/v=2/SID=w/TID=***/D=E/OV=0/S***
そのときの
 リファラ: http://search.yahoo.co.jp/search?p=***&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
 ステータスコード:HTTP/1.x 302 Found
 転送先: http://rc20.overture.com/d/sr/?xargs=***

転送されてきたURL:http://rc20.overture.com/d/sr/?xargs=***
そのときの
 リファラ: http://search.yahoo.co.jp/search?p=***&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8
 ステータスコード: HTTP/1.x 302 Found
 転送先: http://PPCの対象URL

さらに転送されてきて:http://PPCの対象URL
そのときの
 リファラ: http://search.yahoo.co.jp/search?p=***&search.x=1&fr=top_ga1&tid=top_ga1&ei=UTF-8

見ればわかるように 302で飛ばしながらくるので、
リファラは常に検索結果ページのURL
つまり、リファラだけみてもPPCからきたのか、SEOなのかわからないという。
まあPPCでも検索ワードが拾えるわけだけど。

で結局送られくるデータだけだと
どうしようもないので、ひと手間かけて、実現しました。

やり方としては Webmater Tool系 + PPCの機能 + PHP ってかんじ。

近いうちにツールでも公開しますかね。

Continue Previous page Next page

Twitter