3

Amazon製品APIを使用しています。

$ItemAttr = $Item['ItemAttributes'];

$ItemAttr多次元配列が含まれるようになりました 。

if(is_array($ItemAttr["Author"])){$Author = implode(", ", $ItemAttr["Author"]);
}else{
$Author = $ItemAttr["Author"];}

上記のコードを使用すると、Undefined index: Author in line 1 and line 3

私はこのようにしてみました

if(isset($ItemAttr["Author"])) {
if(is_array($ItemAttr["Author"])){$Author = implode(", ", $ItemAttr["Author"]);
}else{
$Author = $ItemAttr["Author"];}
}

そのエラーを解消します。

しかし後で、このようなコードを使用するとエラー$RetVal = array( 'Author' => $Author);が発生しますUndefined variable : Author

だれか正しい方法を教えてください。

注意:キー$Item['ItemAttributes'];が含まれている場合と含まれていない場合がありAuthorます。つまり、返された製品が本である場合、配列は著者キーを返します。それ以外の場合は..

4

3 に答える 3

2

先月、Amazon Books API を実装しましたが、これとまったく同じ問題を覚えています。私が助けてくれたことがなかったので、あなたはどれほど幸運でしたか:(

返される構造に一貫性がないため、Amazon は非常に厄介です (まあ、以下のものを除いて、それは消費するのを面倒にします):

  • 1 つのアイテムが返された場合、それは OBJECT です
  • 複数のアイテムが返される場合、それは ARRAY です
  • 何も返されない場合、何も存在しません

個人的には、少なくとも空の配列を使用し、配列に固執するべきだったと思います。いつでも配列にオブジェクトを追加できます >< しかし、少なくとも構造は一貫しています。

私がそれを回避した方法は、すべてが配列であり、構造全体が事前定義されていることを保証する、返された構造の新しい表現を作成することでした。このようにして、データが存在しない、または配列の場合にオブジェクトとしてアクセスされているなどのエラーが発生しないことを100%認識して、後でデータにアクセスできます。

まず、次のような構造を作成します。

$structure = array( 'isbn' => '', 'authors' => array(), 'pictures' => array(), 'title' => '' );

次に、関数またはオブジェクト メソッド (スタイルに応じて) を作成して、返された amazon データを消費し、可能なものを見つけてカスタム構造に挿入します。

最初にそれが存在することを確認し、次にそれが配列またはオブジェクトであるかどうかを確認して、アクセス方法を知ってください。Amazon から返されたいくつかの結果をいくつかの異なる本で印刷するのに役立ちます。

次に、本の詳細にアクセスするには、$structure のデータに依存できます ;) すべてが配列であり、すべてが存在することが保証されています。

foreach ($structure['authors']...

配列ではない、存在しない、または実際にはオブジェクトであるというエラーは発生しません!!!

疑似コードの種類は次のようになります。

$returned_amazon_data = get_amazon_data('http://amazon.com/api/book=1234567');
$book = consume_amazon_result($returned_amazon_data);
if ($book) {
//print out the authors, if no authors were found, will just stay blank as it's GUARANTEED to always be an array of strings
print implode($book['authors']);
}

楽しむ!私は私がしたことを知っています(nt)...

于 2012-11-18T17:33:30.973 に答える
2

一番上の空の変数$Authorを初期化しますか?

$Author = ""; //initialize here

if(isset($ItemAttr["Author"])) 
{
    if(is_array($ItemAttr["Author"]))
    {
        $Author = implode(", ", $ItemAttr["Author"]);
    }
    else
    {
        $Author = $ItemAttr["Author"];
    }
}
于 2012-11-18T17:26:24.937 に答える
1

predefine だけでなく、2 つの条件ステートメントを組み合わせることができます$Author

$Author = '';
if(isset($ItemAttr["Author"]) && is_array($ItemAttr["Author"])){
    $Author = implode(", ", $ItemAttr["Author"]);
}elseif(isset($ItemAttr["Author"])){
    $Author = $ItemAttr["Author"];
}

これにより、両方のエラーが解消されます。

于 2012-11-18T17:25:46.783 に答える