2015-11-03 169 views
2

我試圖提取混合關聯數組,如:PHP - 提取關聯數組

<pre> 
     <?php 


     bar(); 

     function bar(){ 
      $apple = 6; 
      $ball = 2; 
      $cat = 3; 

      $data = ["apple" => 1, $ball,$cat]; 

      foo($data); 
     } 

     function foo($data){ 
      extract($data); 
      echo "<br />apple:" . $apple; 
      echo "<br />ball:" . $ball; 
      echo "<br />cat:" . $cat; 
     } 

     ?> 
</pre> 

$data數組只能是數字,只有聯想或兩者兼而有之。如果數組的元素遺漏了一個索引,它應該與變量相同。

+0

@Andrew,編號數組有時只能關聯或數字。他們混合到任何級別。 – tika

+0

'$ ball'和'$ cat'被定義在範圍內(提取之前),因此它們仍然存在。這就是爲什麼他們不起作用。運行提取時,數組沒有索引要分配給變量。 。 – Twisty

+0

RTFM - >提取使用鍵作爲變量名創建變量,並將值作爲... erm ...值。在你的第一個代碼片段中,'$ cat'和'$ ball'與數組中的鍵'0'和'1'具有相同的值,但'extract'實際上是跳過數字索引 –

回答

5

這在您的函數中不起作用,因爲$ ball和$ cat沒有在函數範圍中定義。如果數組中的值有一個$ apple所做的鍵,那麼extract()函數只會將值賦給變量。這意味着$ apple會在函數中輸出,但是$ ball和$ cat會被定義。

發生這種情況是因爲爲了使extract()知道爲變量命名什麼,數組中必須有一個鍵。

要做到這一點,你要麼需要手動陣列中的每個時間指定鍵:

$apple = 6; 
$ball = 2; 
$cat = 3; 
$data = ["apple" => $apple, "ball" => $ball, "cat" => $cat]; 

// Now, extracting from $data creates the variables we need... 
// Unsetting the $apple, $ball, and $cat variables 
// allows us to see that extract is recreating them. 
unset($apple, $ball, $cat); 
extract($data); 
echo $apple, $ball, $cat; 

,或者您需要檢查$球和$貓變量,看看他們是否是數組。如果它們是數組,那麼可以在數組中使用它們的鍵,以便extract()知道要創建的變量的名稱。你需要動態地確定一個變量是否已經有一個鍵(是一個數組),還是這足夠了?

編輯:這不應該與提取()。實際上,你應該創建一個類並將這些數據存儲在一個類中。然後,加載課程會給你這個信息。提取物()是一種危險而雜亂的野獸。

+0

好的一點是取消設置變量,瞭解會發生什麼......!如果沒有$ data中的「球」和「貓」鍵,這段代碼就無法工作! – Random

+0

@Random:除非你在你提取的值的前面加上 –

+0

@MikelBitson,否則數據是混合數組,並且是數組。 – tika

0

替代答案。這一點仍然相同,如果你有一個混合內容的數組,不要使用extract()

function foo($data){ 
    extract($data); 
    echo "<br />apple:" . (isset($apple)?$apple:$data[0]); 
    echo "<br />ball:" . (isset($ball)?$ball:$data[1]); 
    echo "<br />cat:" . (isset($cat)?$cat:$data[2]); 
} 

你可以看到這裏的陷阱。如果數據索引更多或更少,或者訂單不正確,您將收到失敗的索引或不正確的值。

+0

問題是我不知道什麼是未來,蘋果,球,飛機.. 。:( – tika

+0

任何方式來格式化數據?數據如何呈現給你? – Twisty