array element ansprechen

Johannes Schmidt

Grünschnabel
Hi,

ist leider schon etwas her, dass ich das letzte mal mit php zu tun hatte daher stehe ich gerade vermutlich auch nur auf dem Schlauch...

Ich würde gerne ein array-element ansprechen dessen schlüsselfeld zuvor in einem string gespeichert wurde. Also in etwa so:

PHP:
$testarr = array();
$testarr[0] = "test0";
$testarr[1] = "test1";
$teststring = "[0]";
echo $testarr{$teststring};

Ich war mir sicher, dass das mit geschweiften Klammern geht, das scheint aber nicht ganz richtig zu sein. Ich bekomme zumindest bei oben aufgeführtem Beispiel die Meldung:
Notice: Undefined index: [0] in ...
Die Gegenprobe mit echo $testarr[0]; gibt mir aber so wie es sich gehört test0 zurück.

Was mache ich falsch?

Vielen Dank!
 
PHP:
$testarr = array();
$testarr[0] = "test0";
$testarr[1] = "test1";
$teststring = "0";
echo $testarr[$teststring];

Meinst du so etwas? Dein $teststring könnte im Prinzip auch eine "$testzahl" sein.

PHP:
$testarr = array();
$testarr[0] = "test0";
$testarr[1] = "test1";
$testzahl = 0;
echo $testarr[$testzahl];

Viele Grüße,
MAN
 
Hi,

danke für deine Antwort. Leider muß es mein teststring bleiben, da ich in der finalen Version damit auf Elemente in einem multidimensionalen array zugreifen möchte:

PHP:
$testarr = array();
$testarr[0] = array();
$testarr[1] = "test1";
$testarr[0][1] = "test01";
$testarr[0][2] = "test02";
$teststring = "[0][2]";
echo $testarr{$teststring};
 
Wenn es immer ein zweidimensionales Array ist dann würde ich es auch so machen wie oben genannt. Macht ja nicht den Unterschied.

Alle anderen Lösungen (evtl. auch eval()) sind eher unsauber.

lg
 
Hi,

leider handelt es sich nicht immer um ein zweidimensionales array. Es können beliebig tiefe Strukturen vorkommen die verarbeitet werden müssen.

Wie setzte ich eval() richtig ein? Aus der Referenz auf php.net werde ich nicht so 100% Schlau.

Ich habe gerade schon folgendes (ohne Erfolg) versucht:

PHP:
eval ("echo $testarr".$teststring.";");

Danke für eure Hilfe!
 
Zeig doch mal, was Du damit vorhast. Wie werden diese Strukturen denn verarbeitet?

Das wäre auch meine nächste Frage gewesen. Vielleicht lässt sich das ganze auf eine andere sinnvolle Struktur bringen.

Das mit eval zu machen ist (wie Klein0r schon sagte) sehr unsauber. Warum nicht die Strukturen benutzen, die PHP bereits kann?

Viele Grüße,
MAN
 
Wie setzte ich eval() richtig ein? Aus der Referenz auf php.net werde ich nicht so 100% Schlau.

Ich habe gerade schon folgendes (ohne Erfolg) versucht:

PHP:
eval ("echo $testarr".$teststring.";");


...so sollte es gehen:
Code:
eval ('echo $testarr'.$teststring.';');

Da du bei dir doppelte Anführungszeichen verwendest, wird $testarr darin sofort verarbeitet, was folgendes ergibt:....
Code:
echo Array[0];

Mit einfachen Quotes bleibt $testarr vorerst ein String, und erst der gesamte Ausdruck wird verarbeitet:....
Code:
echo $testarr[0];

Du könntest auch eine eigene Funktion nehmen, die das benötigte Element zurückliefert, bspw. so:
Code:
<?php
$testarr = array();
$testarr[0] = "test0";
$testarr[1] = array('Halli','Hallo','Hallöle');

function funktion($arr,$keys=array())
{
  $return=$arr;
  foreach($keys as $k)
    {
      $return=$return[$k];
    }
  return $return;
}

echo  funktion($testarr,array(1,2));//Ausgabe: Hallöle
?>
 
Danke Sven!

... So dinge wie einfach und doppel-quotes vergisst man am schnellsten wieder wenn man ewig nichts mehr mit PHP gemacht hat. :rolleyes:

Für die anderen, so sieht meine Funktion aus, wenn jemand einen besseren (schnelleren) Ansatz hat, nur her damit:

PHP:
/**
   This function merges tree parts
   @param array tree_section
   @param array tree_position
   @author Johannes Schmidt
  */
  private function add2Tree($tree_section, $tree_position = array()) {
  	logger("genXLS add2Tree","starting to add",LOG_LEVEL_DEBUG);
  	// build the key
    $key = "";
    foreach($tree_position as $key0 => $valu0) {
      $key .= "['".$valu0."']";
    }
    logger("genXLS add2Tree key",$key,LOG_LEVEL_DEBUG);
    // go through the tree and check if the key already exists and add the tree part if not
  	foreach($tree_section as $key1 => $value1) {
  	  $check = false;
  	  eval ('if(isset($this->tree'.$key.'[$key1])) $check = true;');
  	  logger("genXLS add2Tree ".$key1,$check,LOG_LEVEL_DEBUG);	  
  	  if($check == false) {
  	  	eval ('$this->tree'.$key.'[$key1] = $value1;');
  	  } else {
  	  	$tree_position[] = $key1;
  	  	$tree_position[] = "child";
  	  	if(isset($value1['child'])) {
  	  	  $this->add2Tree($value1['child'], $tree_position);
  	  	} else {
  	  	  logger("genXLS add2Tree ".$key1, "The function was not able to merge the sub tree in the main tree. code 7000",LOG_LEVEL_NORMAL);
  	  	}
  	  }
  	}
  	
  }

Die Funktion wird von einer anderen Funktion in einer Schleife für jeden meiner Bäume aufgerufen und ist damit Teil eines quick hacks um dieses Problem zu umfahren: http://www.tutorials.de/forum/php/326428-array-zusammenfuehren.html#post1685856

Viele Dank für eure Hilfe!
 
Zurück