Verarbeitung von Multidimensionalen Arrays

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

folgendes Problem:

Für mein Templatesystem muss ich testen, ob ein returnwert ein Multidimensionaler Array ist und diesen weiter verarbeiten. Normaler Arrays sind kein Problem, bei Mehrdimensionalen steh ich allerdings aufn Schlauch.

So erstelle und befülle ich den Mehrdimensionalen Array

PHP:
$menulink = array(array());

foreach ($this->pdo->resultset() as $row) {
 
  $menu = $row['name'];
  $text = $row['text'];
  $id = $row['id'];

  if ($row['link'] != "") {
  //$link = $row['link'];
  //$menulink[] = $row2['menustart'] . '<a href="' . $link . '" >' . $text . '</a>' . $row2['menuend'];
  $menulink[][] = $this->tpl->load("menu/menulink");
  $menulink[][] = $this->tpl->assign("menu", $menu);
  $menulink[][] = $this->tpl->assign("text", $text);
  $menulink[][] = $this->tpl->assign("id", $id);
  $menulink[][] = $this->tpl->display();
  } else {
  if ($row1['sefurls'] == "1") {
  //  $menulink[] = $row2['menustart'] . '<a href="' . $row['name'] . '.htm">' . $row['text'] . '</a>' . $row2['menuend'];
  $menulink[][] = $this->tpl->load("menu/menusef");
  $menulink[][] = $this->tpl->assign("menu", $menu);
  $menulink[][] = $this->tpl->assign("text", $text);
  $menulink[][] = $this->tpl->assign("id", $id);
  $menulink[][] = $this->tpl->display();
  } else {
  // $menulink[] = $row2['menustart'] . '<a href="/index.php?p=' . $row['name'] . '">' . $row['text'] . '</a>' . $row2['menuend'];
  $menulink[][] = $this->tpl->load("menu/menu");
  $menulink[][] = $this->tpl->assign("menu", $menu);
  $menulink[][] = $this->tpl->assign("text", $text);
  $menulink[][] = $this->tpl->assign("id", $id);
  $menulink[][] = $this->tpl->display();
  }
  }
  }

  return array(array($menulink));

und so verarbeite ich momentan den normalen Array im Templateparser:

PHP:
  public function assign($replace, $replacement) {
  if(is_array($replacement)){
  foreach($replacement as $repl){
  $replacement1 = implode("", $repl);
  $this->template = str_replace($this->leftDelimiter . $replace . $this->rightDelimiter, $replacement1, $this->template);
  }
  }else{
  $this->template = str_replace($this->leftDelimiter . $replace . $this->rightDelimiter, $replacement, $this->template);
  }
  }

Wie kann ich jetzt testen, ob ein return Wert ein Multidimensionaler Array ist? Stimmt der return wie ich ihn gemacht habe überhaupt?

Hab ehrlich gesagt noch nie mit Mehrdimensionalen arrays gearbeitet, nur normalen bis jetzt.

mfg
Christoph
 
Zuletzt bearbeitet:
Ich glaube ehrlich gesagt nicht, dass dein Code das tut, was du glaubst und willst. :)

Lass dir mal vor der return-Zeile per var_dump ausgeben, was in $menulink steht. (Bzw. in array(array($menulink)). Halt das, was zurückgegeben wird.)
 
Warum gibst du bei return aus der Funktion im oberen Code array(array(...)) zurück? $menulink ist doch schon ein zwei-dimensionales Array. Das noch mal in ein 2d-Array zu packen klingt semantisch erstmal sinnfrei. Hast du schon geprüft, ob mindestens eine der Bedingungen oben zutrifft? Zb. mittels var_dump() auf $row, bzw. liefert das resultset überhaupt was?

Was ist das hier überhaupt: $this->pdo->resultset()? Ist pdo überhaupt ein richtiges PDO? Dann gibt es diese Funktion gar nicht, statt dessen musst du mit fetch() arbeiten. Siehe auch mein Tutorials zu PDO: https://www.tutorials.de/resources/php-prepared-statements-mit-pdo-teil-1-einfuehrung.220/
 
PDO ist ein richtiges PDO,

resultset() ist eine funktion in meiner PDO Klasse und besteht aus execute() und fetchall();

Die Bedingungen treffen zu, funktionieren ja auch bei nem normalen Array.

Wenn ich beim normalen array nur return $menulink; arbeite, kriege ich ne fehlermeldung, diese ist aber weg wenn ich return array($menulink) verwende. Darum hab ich das beim Mehrdimensionalen Array auch versucht.
 
Und wie lautet die Meldung?

Da von dir beschriebene Verhalten deutet allerdings genau darauf hin, dass die foreach() genau 0-mal durchlaufen wird. Insbesonders weil du $menulink mit 2d-Array vorinitialisierst. Stell es mal auf $menulink = null; und schau was als Ergebnis rauskommt.

Ich denke aber auch, dass der Code, sowie du ihn geschrieben hast, bestimmt nicht das machen wird, was du eigentlich vor hast. Trocken-Übungen mit 2d-Arrays?

PHP:
$myArray[][] = 'testA';
$myArray[][] = 'testB';

var_dump($myArray);

//

unset($myArray);
$myArray[0][] = 'testA';
$myArray[0][] = 'testB';

var_dump($myArray);

//

unset($myArray);
$myArray[0][0] = 'testA';
$myArray[0][1] = 'testB';

var_dump($myArray);

//

unset($myArray);
$myArray[0][0] = 'testA';
$myArray[1][0] = 'testB';

var_dump($myArray);
 
Danke für die kleine Übung saftmeister.

Ich will lediglich, das für jeden Link in der DB das entsprechende Template geladen, befüllt und angezeigt wird. Darum meine Idee mit dem Mehrdimensionalen Array.

Wie kann ich das sonst machen?
 
Ich denke, dass es überhaupt nicht notwendig ist, dass mit einem 2d-Array zu machen. Kommt dir das nicht selbst unnötig kompliziert vor? Spätestens dann solltest du dir die Frage stellen: Ist das überhaupt eine elegante, wartbare und vor allem einfache Lösung?

Stelle dir die folgenden Fragen: Warum bist du nich der ersten Eingebung gefolgt, das über ein 1d-Array zu lösen? Was muss angepasst werden, damit es so funktioniert, wie du es dir vorstellst?

Ich stelle hier mal folgende Fragen technischer Natur:

1. Was gibt tpl->load() zurück?
2. Was gibt tpl->assign() zurück?
3. Was gibt tpl->display() zurück?
4. Wäre es möglich, dass nur tpl->display() einen Rückgabewert braucht und die anderen beiden Funktionen auf internen Variablen arbeiten?
 
Ok werd ich mir zu gemühte führen. Daran hab ich nämlich nicht gedacht, das eventuell nur tpl->display in the array gehören würde.

Der Templateparser arbeitet über $this->template intern als Rückgabewert.

So jetzt ist schluss für heuer mit geposte, hab schon zuviel Intus, bitte um Nachsicht bezüglich der Netiquette:P

So im diesen Sinne: Danke für die Hilfe und Guten Rutsch.
 
Zurück