2017-04-18 114 views
1

我們有一個多維關聯數組。有必要在一個寫在其他線性數組上的鍵上尋址一個數組的元素。如何通過另一個線性數組中的鍵訪問多維數組的元素?

也就是說,有一個多維數據陣列和一個帶鑰匙的線性陣列:

$a=[ 
    'animals'=> [ 
    'cats' => [ 
     'catusdomesticus' => 'home', 
     'pantera' => 'wild' 
    ] 
    ] 
]; 

$keys=['animals', 'cats', 'pantera']; 

有兩兩件事要做:

  1. (簡單)獲取$ a的值[ '動物'] [ '貓'] [ '貓']
  2. (復)刪除元素美元[ '動物'] [ '貓'] [ '貓']

如何在PHP5中執行此操作?

注意:這是必需的沒有代碼生成和eval()。

UPD:

獲得價值很簡單:

$item =& $a; 
foreach($keys as $key) 
    $item =& $item[$key]; 
var_dump($item); 

對於remove元素我嘗試下面的代碼:

$item =& $a; 
for($i=0; $i<count($keys); $i++) 
{ 
    $item =& $item[$keys[$i]]; 

    if($i===count($keys)-1) { 
    echo "\nDelete element:\n"; 
    var_dump($item); 

    unset($item); 
    } 
} 
var_dump($a); 

但是,這是不行的。 unset()通過引用數組的值可以刪除數組元素。

UPD2:用於設定值

簡短的解決方案或從數組中刪除元素:

$item =&$a; 
foreach($keys as $key) { 
    $array =& $item; 
    $item =& $item[$key]; 
} 
$array[$key] = 42; // For set value 
OR 
unset($array[$key]); // For remove element 
+0

爲什麼不是關鍵'catusdomesticus'是新的數組的數組值?有理由嗎? –

+0

你有什麼嘗試? 1.你必須自己嘗試2.如果出現問題,你來這裏請求我們的幫助。祝你好運! –

+0

@Tobias F,數組的結構事先是未知的。它具有無限的嵌套深度和無限的兄弟元素。 – Xintrea

回答

1
function get_value($keys, $a) 
{ 
    foreach($keys as $k) 
    { 
     if (isset($a[$k]) 
     { 
      if (is_array($a[$k])) 
      { 
       return get_value($keys, $a[$k]); 
      } 
      else 
      { 
       return $a[$k]; 
      } 
     } 
    } 

    return null; //nothing found 
} 
+0

+1對於遞歸方法!我寫了類似於早上熱身練習的東西,但U速度更快。 – MarcM

+0

當你回答一個問題時,你應該添加一個簡要描述它的功能和原因,幫助人們從答案中學習的目標不僅僅是給他們代碼。 – Jpsh

+0

這是簡單問題的答案。如何刪除元素? – Xintrea

0

這裏有兩種方法,我假設第二個方法將解決您發出最。

<?php 

$a=[ 
    'animals'=> [ 
    'cats' => [ 
     'catusdomesticus' => 'home', 
     'pantera' => 'wild' 
    ] 
    ] 
]; 

$keys=['animals', 'cats', 'pantera']; 

//Method 1, excplicitly say which associative values you want 
echo $a[$keys[0]][$keys[1]][$keys[2]]; 
echo "<br/>"; 

//Method 2 use a loop and keep going down 
$holder = $a; 
foreach($keys as $key){ 
    $holder=$holder[$key]; 
} 
echo $holder; 

?> 
+0

方法1不正確。此代碼取決於鍵數組大小。如何獲得 '$ keys = ['animals','cats']? – Xintrea

+0

如何使用方法2刪除元素? – Xintrea

0

我們可以刪除使用參考用小的調整

$a=[  
    'animals'=> [ 
    'cats' => [ 
     'catusdomesticus' => 'home', 
     'pantera' => 'wild' 
    ] 
    ] 
]; 

$keys=['animals', 'cats', 'pantera']; 

$delItem = &$a; 

foreach($keys as $key=>$val){ 
    if($key == count($keys)-1)  
     $lastKey = $val; 
    else 
     $delItem = &$delItem[$val]; 

} 
echo $delItem[$lastKey];//Get Value 
unset($delItem[$lastKey]);//Remove Value  
print_r($a);` 
+0

這是一個很好的答案。查看UPD2。 – Xintrea

相關問題