多维数组中未定义的索引

3
我正在使用亚马逊产品API。
$ItemAttr = $Item['ItemAttributes'];

现在,$ItemAttr 包含一个多维数组。
if(is_array($ItemAttr["Author"])){$Author = implode(", ", $ItemAttr["Author"]);
}else{
$Author = $ItemAttr["Author"];}

现在我使用上述代码时,我遇到了“第1行和第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键,也可能不包含。我的意思是,如果返回的产品是一本书,该数组将返回作者键。否则它将不会。

3个回答

2

在顶部初始化空变量$Author

$Author = ""; //initialize here

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

2
我上个月刚刚实现了亚马逊图书API,我还记得这个问题。你真幸运,因为我当时没有得到帮助。
亚马逊非常烦人,因为它们返回的结构没有一致性(除了下面的)。如果只返回一个项目,则为对象;如果返回多个项目,则为数组;如果没有返回任何内容,则根本不存在。我个人认为他们应该至少使用空数组,并坚持使用数组。您始终可以将对象添加到数组中,但至少结构会保持一致。
我的解决方法是创建一个新的表示返回结构的方式,确保所有内容都是数组并且整个结构都是预定义的。这样,我稍后可以访问数据,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']);
}

玩得开心!我知道我也是...


谢谢,记得如果你认为更新的答案更好地回答了你的问题,那么你可以更改标记的答案;)你可能不想太快把问题标记为已解决,因为如果我看到你标记它为已解决 - 我会跳过它!其他人可能也会这样做。很高兴它有用 :) - HenchHacker

1

您可以将两个条件语句合并,同时预定义$Author

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

这应该可以消除两个错误。


这将消除错误,但最好创建一个新的结构来使用,以满足您需要的保证。每次访问时都编写这样的代码是最糟糕的偏执编程。我在上个月使用亚马逊图书搜索API时解释得更多 - 现在我尽可能避免使用亚马逊API! - HenchHacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接