2008-12-28 18 views
15

Ich arbeite an einem Programm, das die internen Array-Zeiger von PHP verwendet, um entlang eines mehrdimensionalen Arrays zu iterieren. Ich brauche ein Element aus der aktuellen Reihe zu bekommen, und ich habe es getan, wie so:Zugriff PHP Array-Element mit einer Funktion?

$arr[key($arr)]['item'] 

aber ich würde viel lieber etwas verwenden, wie:

current($arr)['item'] // invalid syntax 

Ich bin Hoffnung, es gibt sich als eine Funktion gibt, die ich in meinem Scan der Dokumentation verpasst haben, die mir das Element wie so zuzugreifen ermöglichen würde:

getvalue(current($arr), 'item') 

oder

current($arr)->getvalue('item') 

Irgendwelche Vorschläge?

+2

Sie haben bereits die beste Lösung gefunden: $ arr [key ($ arr)] ['item'] –

+0

Der 'getvalue'-Ansatz wäre auch für eindimensionale Arrays nützlich. Es würde erlauben, die Syntaxbeschränkungen von ≤5.3 zu bearbeiten und zu erlauben, auf ein Element von einem Array, das z. B. von einem Funktionsaufruf zurückgegeben wird, direkt innerhalb einer Anweisung zuzugreifen. Ich vermisse solche interne Funktion. – Glutexo

Antwort

12

Ich bezweifle sehr, es ist eine solche Funktion, aber es ist trivial

function getvalue($array, $key) 
{ 
    return $array[$key]; 
} 

bearbeiten zu schreiben: Ab PHP 5.4, können Sie Index Array-Elemente direkt von Funktionsausdrücken, current($arr)['item'].

+3

Ich denke, das ist wahrscheinlich, was ich am Ende tun werde. Wenn Sie Recht haben, dass es keine solche Funktion gibt, ist das eine ziemlich schlechte Aufsicht. –

1

Haben Sie schon einmal einen der iterator classes ausprobiert? Da könnte etwas drin sein, das genau das tut, was du willst. Wenn nicht, können Sie wahrscheinlich erhalten, was Sie wollen, indem Sie die ArrayObject-Klasse erweitern.

+0

Ich habe mir nur diese angesehen - es sieht so aus, als ob das nur eine objektorientierte Methode ist, um durch das Array zu iterieren.Der ArrayIterator :: current gibt das aktuelle Element zurück, ähnlich wie die Funktion current(), was nicht wirklich das Problem ist, das ich hatte. –

-1

Wenn dies nicht funktioniert, wie ist Ihr multidimensionales Array zusammengesetzt? Ein var_dump() könnte helfen.

$subkey = 'B'; 
$arr = array(
    $subkey => array(
     'AB' => 'A1', 
     'AC' => 'A2' 
    ) 
); 


echo current($arr[$subkey]); 
next($arr[$subkey]); 
echo current($arr[$subkey]); 
+0

Die Iteration, die ich durchführe, ist wirklich nur entlang des primären Arrays. Ich sagte "multidimensional", weil die entsprechenden Elemente des Hauptarrays selbst Arrays sind, aber ich möchte nicht über sie iterieren - ich möchte einfach nur auf sie zugreifen. –

+0

Wie behandelt man $ arr [$ subkey] als Array oder $ new_arr = array_values ​​($ arr [$ subkey])? Fußnote: Was unterscheidet zwischen Ihrer angeforderten aktuellen ($ arr) ['item'] und aktuellen ($ arr ['item'])? – chelmertz

-1

Ich verwende oft

foreach ($arr as $key=>$val) { 
    $val['item'] /*$val is the value of the array*/ 
    $key   /*$key is the key used */ 
} 

statt

nächste ($ arr)/Strom ($ arr)

+0

Ich benutze das auch - um der Frage willen beseitige ich die Tatsache, dass ich tatsächlich zwei sortierte Arrays untersuche, die nach Unterschieden suchen, und ich bin mir ziemlich sicher, dass foreach diesen Zugang nicht unterstützt, aber ich könnte es sein falsch. Wie auch immer, danke für deine Antwort. :) –

0

Diese Funktion könnte ein bisschen lenghty sein, aber ich benutze es die ganze die Zeit, speziell in Szenarien wie:

if (array_key_exists('user', $_SESSION) === true) 
{ 
    if (array_key_exists('level', $_SESSION['user']) === true) 
    { 
     $value = $_SESSION['user']['level']; 
    } 

    else 
    { 
     $value = 'DEFAULT VALUE IF NOT EXISTS'; 
    } 
} 

else 
{ 
    $value = 'DEFAULT VALUE IF NOT EXISTS'; 
} 

dazu Turns:

Value($_SESSION, array('user', 'level'), 'DEFAULT VALUE IF NOT EXISTS'); 

Hier ist die Funktion:

function Value($array, $key = 0, $default = false) 
{ 
    if (is_array($array) === true) 
    { 
     if (is_array($key) === true) 
     { 
      foreach ($key as $value) 
      { 
       if (array_key_exists($value, $array) === true) 
       { 
        $array = $array[$value]; 
       } 

       else 
       { 
        return $default; 
       } 
      } 

      return $array; 
     } 

     else if (array_key_exists($key, $array) === true) 
     { 
      return $array[$key]; 
     } 
    } 

    return $default; 
} 

PS: Sie können auch eindimensional Arrays verwenden, wie folgt aus:

Value($_SERVER, 'REQUEST_METHOD', 'DEFAULT VALUE IF NOT EXISTS'); 
Verwandte Themen