2017-04-11 185 views
2

我試着去訪問一個嵌套的數組(其中包含數組包含數組的數組...)訪問嵌套的陣列

我需要的最後一個值,給出的陣列和鍵的路徑。

鑑於foo和A到Z我需要得到

foo[a][b][c]…[x][y][z] 

我想知道是否有任何更優雅的方式比這個?

function getValueRecursive(array $array, string ...$identifyer){ 
    $value = $array; 

    foreach($identifyer as $key){ 
     if(!key_exists($key, $value)) 
      return NULL; 

     $value = $value[$key]; 
    } 

    return $value; 
} 

$foo = [ 
    'a' => [ 
     'b' => [ 
      'c' => "Hallo Welt!" 
     ] 
    ] 
]; 

echo getValueRecursive($foo, 'a', 'b', 'c');         // Returns "Hallo Welt!" 
+0

你在期待嗎?我已在我的文章中更新過。 –

回答

3

PHP code demo

<?php 

$foo = [ 
    'a' => [ 
     'b' => [ 
      'c' => "Hallo Welt!" 
     ] 
    ] 
]; 
$result=array(); 
array_walk_recursive($foo, function($value,$key) use (&$result){ 
    $result[]=$value; 
}); 
print_r($result[0]); 

或者

<?php 
ini_set("display_errors", 1); 
$foo = [ 
    'a' => [ 
     'b' => [ 
      'c' => "Hallo Welt!" 
     ] 
    ] 
]; 
echo getValueOfArray($foo,"a","b","c"); 
function getValueOfArray($array) 
{ 
    $args=func_get_args(); 
    unset($args[0]); 
    $string=""; 
    foreach($args as $value) 
    { 
     $string.="['$value']"; 
    } 
    eval('if(isset($array'.$string.')) 
    { 
     $result= $array'.$string.'; 
    }'); 
    return $result; 
} 

輸出: Hallo Welt!

+0

前一個更好,更準確。你可以告訴用戶可以這樣做,而不是他在做什麼 –

+0

@AlivetoDie我不知道爲什麼每個人都在低調投票,即使我試圖回答幫助某人。 –

+0

不要怕-ve標記。做你的工作。這裏的人們都很瘋狂(那些沒有任何理由的人就是這樣做的)。順便說一句第一個例子+1 –

1

一段時間AG o我寫了arrays library使用ArrayAccess接口來實現這樣的操作。它不僅可以檢索,還可以存儲和刪除值。

對於所有offset*()方法我用高階方法walkThroughOffsets

protected function walkThroughOffsets(
     &$array, 
     Callable $baseCaseAction, 
     Callable $offsetNotExistsAction 
    ) { 
     $offset = array_shift($this->offsets); 
     if (is_scalar($offset) && isset($array[$offset])) { 
      if (empty($this->offsets)) { 
       return $baseCaseAction($array, $offset); 
      } 
      return $this->walkThroughOffsets(
       $array[$offset], 
       $baseCaseAction, 
       $offsetNotExistsAction 
      ); 
     } 
     return $offsetNotExistsAction($array, $offset); 
    } 

有了這個方法,你可以實現offsetGet方法(當您試圖訪問數組值的叫法)是這樣的:

public function offsetGet($offset) 
    { 
     $this->setOffsets($offset); 
     return $this->walkThroughOffsets(
      $this->container, 
      function ($array, $offset) { 
       return $array[$offset]; 
      }, 
      $this->undefinedOffsetAction 
     ); 
    } 

然後你可以得到像普通陣列一樣簡單的值:

$array = new CompositeKeyArray([ 
    'foo' => [ 
     'bar' => 'baz' 
    ] 
]); 

var_dump($array[['foo', 'bar']]); // => string(3) "baz" 
var_dump($array[['foo', 'quux']]); // => PHP Fatal error: Uncaught UndefinedOffsetException: Undefined offset quux.