多维数组中的未定义索引

时间:2012-11-18 17:22:45

标签: php arrays multidimensional-array

我正在使用亚马逊产品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密钥。我的意思是如果返回的产品是一本书,该数组将返回作者密钥。否则它不会......

3 个答案:

答案 0 :(得分:2)

在顶部初始化空变量$Author

$Author = ""; //initialize here

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

答案 1 :(得分:2)

我上个月实施了亚马逊书籍api,我记得这个问题完全相同。你有多幸运,因为我没有让我帮忙:(

亚马逊非常讨厌,因为他们返回的结构中没有一致性(好吧,除了下面的内容,但是这会让消费变得烦人):

  • 如果退回一件商品,则为OBJECT
  • 如果返回多个项目,则为ARRAY
  • 如果没有返回任何内容,那么
  • 就不存在了

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

我绕过它的方式是创建一个返回结构的新表示,保证一切都是一个数组,并且整个结构是预先定义的。通过这种方式,我可以在以后访问数据时100%知道它不会给我带来错误,就像它不存在一样,或者当它是一个数组时被作为对象访问。

首先,按照以下方式创建结构:

$ structure = array( 'isbn'=> ', 'authors'=>阵列(), 'pictures'=>阵列(), 'title'=> “” );

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

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

然后,要访问有关该书的详细信息,您可以依赖$结构中的数据;)所有内容都是一个数组,并保证一切都存在,这样做:

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)......

答案 2 :(得分:1)

您可以组合两个条件语句,也可以预定义$Author

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

这应该消除这两个错误。