2017-04-18 69 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

相关问题