2017-04-11 1 views
2

Im Versuch, eine verschachtelte Array zuzugreifen (ein Array, das Arrays enthält, welche Arrays enthält ...)Zugang verschachtelte Arrays für bestimmte Tasten

Ich brauche den letzten Wert zu erhalten, da das Array und der Pfad des Schlüssels.

Bei foo und a ... z Ich frage

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

Im bekommen müssen, wenn es eine elegantere Weise als dies?

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

erwartest du das? was ich in meinem Beitrag aktualisiert habe. –

Antwort

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]); 

Oder

<?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; 
} 

Ausgang: Hallo Welt!

+0

vorherige ist viel besser und genauer. Sie können sagen, dass der Benutzer das tun kann, anstatt, was er macht –

+0

@AlivetoDie Ich weiß nicht, warum jeder downvoting ist, auch ich versuche zu antworten, jemandem zu helfen. –

+0

keine Angst vor -ve-Kennzeichnung. Mach deinen Job. Leute hier sind wahnsinnig (Leute, die eine Markierung ohne Grund machen). BTW für das erste Beispiel +1 –

1

einiger Zeit ag o Ich schrieb arrays library, die ArrayAccess Schnittstelle verwendet, um solche Operationen zu erreichen. Es ermöglicht nicht nur das Abrufen, sondern auch das Speichern und Löschen von Werten.

Für alle offset*() Methoden I höherer Ordnung Methode 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); 
    } 

diese Methode Nachdem Sie offsetGet Verfahren implementieren kann (das aufgerufen wird, wenn Sie versuchen, Array-Wert zuzugreifen) wie folgt aus:

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

Dann können Sie Werte so einfach wie mit üblichen Array erhalten:

$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. 
Verwandte Themen