3

我正在使用亚马逊产品 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

$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 回答
2

我上个月才实现了亚马逊图书 api,我记得这个完全相同的问题。你真幸运,因为我从来没有让我帮忙:(

亚马逊很烦人,因为他们返回的结构没有一致性(好吧,除了下面的内容,但这让人很烦人):

  • 如果一件物品被退回,它就是一个 OBJECT
  • 如果返回多个项目,则为 ARRAY
  • 如果什么都不返回,则根本不存在

我个人认为他们至少应该使用空数组,并坚持使用数组。您始终可以将对象添加到数组 >< 但至少结构是一致的。

我解决它的方法是创建一个返回结构的新表示,它保证一切都是一个数组并且整个结构是预定义的。这样我以后可以访问数据,知道 100% 它不会给我错误,比如它不存在或者当它是一个数组时作为一个对象被访问。

首先,创建您想要的结构,例如:

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

然后创建一个函数或对象方法(取决于您的样式)来使用返回的亚马逊数据并找到它可以将其插入到您的自定义结构中。

请记住首先检查它是否存在,然后检查它是数组还是对象,以便您知道如何访问它。它有助于打印出一些亚马逊返回的结果以及一些不同的书籍。

然后,要访问有关这本书的详细信息,您可以依赖 $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 回答
1

您可以组合您的两个条件语句,以及预定义$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 回答