2012-11-18 71 views
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鍵。我的意思是如果返回的產品是一本書,數組將返回作者密鑰。要不然也不會..

回答

1

你可以結合你的兩個條件語句,以及預定義$Author

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

這將消除這兩個錯誤。

+1

上次編輯使我的評論過時;)。 –

+0

這是有道理的。感謝你們兩位:) – user1091558

+0

這將消除錯誤,但你仍然更好地創建一個新的結構來處理,並有你需要的保證。寫出你想要訪問的東西時,就是偏執編碼,這是最糟糕的。我在上個月使用亞馬遜API進行圖書搜索時的回答中解釋了更多 - 現在我在給予機會時避開了亞馬遜API! – VBAssassin

1

初始化頂部的空變量$Author

$Author = ""; //initialize here 

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

我在上個月實施了亞馬遜書籍api,我記得這個問題完全一樣。如何幸運的是你,因爲我從來沒有讓我幫:(

亞馬遜是很煩人的,因爲沒有一致性,他們返回的結構中(當然,除非有什麼下文,但是這使得它惱人的消耗):

  • 如果返回一個項目,它是一個對象
  • 如果返回了多個項目,它是一個數組
  • 如果返回了一無所有,無所存在於所有

個人我認爲他們應該至少使用空數組,並堅持數組。您始終可以將對象添加到數組> <,但至少該結構將保持一致。

我繞過它的方式是創建一個返回結構的新表示,它保證所有東西都是數組,並且整個結構是預定義的。這樣我以後可以訪問數據,知道100%它不會給我像它不存在的錯誤,或者當它是一個數組時被作爲對象訪問。

首先,創建結構,你怎麼想它是如:

$結構=陣列( '書號'=> '', '作者'=>陣列(), '照片' => array(), 'title'=>'' );

然後創建一個函數或對象方法(根據您的樣式)使用返回的亞馬遜數據並找到它可以將其插入到您的自定義結構中。

請記住先檢查它是否存在,然後如果它是一個數組或對象,以便知道如何訪問它。它有助於打印幾個不同的書籍從亞馬遜返回的結果。

然後,訪問細節有關的書,你可以依靠在$結構中的數據;)一切都是一個數組,一切都保證存在這樣做:

的foreach($結構[「作者「] ...

不會產生它不是一個數組,不存在或實際上是一個對象的錯誤!

排序的僞代碼將是:

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

+0

剛剛在最後添加了代碼示例;) – VBAssassin

+0

非常有用的感謝.. Upvoted你的答案.. – user1091558

+0

謝謝,請記住,如果你認爲更新的答案更好地回答你的問題,那麼你可以改變標記的答案這個問題;)你可能不想如此迅速地將您的問題標記爲已回答,因爲如果我看到您已將其標記爲已回答 - 我將跳過它!其他人也可能會這樣做。很高興它是有用的:) – VBAssassin