PHP-Arger mit Array_slice

Silke Schümann wrote this 05:21:

Fast angekommen … die folgende Funktion scheint zu funktionieren. Doch glücklicher oder trauriger Weise erwischte ich beim Test-Array eine Variation, bei der es eben nicht funktioniert. :-( Die verflixte 13 … siehe kleine Demo: Kapitelnummern

Ich habe in dem Programmcode darauf verzichtet, die in der Minidemo verwendete Ausgabe ebenfalls aufzuführen. Die Buchstaben A-C stehen für jeweils zuständige die If-Klausel, es folgt das aktuelle Array-Element, dann die daraus ermittelte Ebene und schließlich die erzeugte Kapitelnummer.

  1. <?php
  2. $jump = array(0,0,0,1,1,0,1,-2,1,0,0,1,-3,0,0);
  3. $chapNr = array();
  4. $level = array();
  5. $m = 0;
  6. $n = count($jump);
  7. $level[0] = 0;
  8. $chapNr[0] = 1;
  9. $chap = array($chapNr[0]);
  10. $chapIndex[0] = implode('.',$chap);
  11. for($m=0; $m<$n; $m++){
  12. $level[$m] = $m>0 ? $level[$m-1]+$jump[$m] : $level[$m];
  13. if($m>0){
  14. //A) Same level
  15. if($jump[$m]==0){
  16. array_push($chap, array_pop($chap)+1);
  17. $chapIndex[$m] = implode('.',$chap);
  18. }
  19. //B) Level below
  20. elseif($jump[$m]==1){
  21. array_push($chap, 1);
  22. $chapIndex[$m] = implode('.',$chap);
  23. }
  24. //C) Level by 'x' up
  25. elseif($jump[$m]<0) {
  26. $chap = array_slice($chap, 0, $level[$m]);
  27. array_push($chap, array_pop($chap)+1);
  28. $chapIndex[$m] = implode('.',$chap);
  29. }
  30. }//END M>0
  31. }//END FOR
  32. ?>

Wenn ich jetzt nur noch wüsste, warum es nicht klappt. PHP scheint nicht gerade die zuverlässigste Programmiersprache zu sein. Ich weiß, dass PHP nicht sonderlich auf den Variablentyp achtet, doch will mir einleuchten, was das in diesem Fall mit dem fehler zu tun hat. *GRRRRRRH*

Eine Forschleife um $array_slice($chap, 0, $level[$m]); zu ersetzen

Wenn es nicht elegant mit Chauffeur geht, dann eben zu Fuß.

  1. $chapTmp = array();
  2. $chapStop = $level[$m]==0? 1 : $level[$m];
  3. for($mfx = 0; $mfx<$chapStop; $mfx++ ){
  4. array_push($chapTmp, $chap[$mfx]);
  5. }
  6. $chap = $chapTmp;
  7. //$chap = array_slice($chap, 0, $level[$m]);

Und gucken, ob's klappt: Demo Kapitelnummern mit der For-Schleife => Tut! :harr:

In dieser Reihe erschienen:

  1. 16.3.2007 — Programmplanung Editland-Menü
  2. 17.3.2007 — Der Linkbaum der Navigation in Editland
  3. 1.4.2007 — Was Kapitelnummern mit Array_slice() zu tun haben
  4. 4.4.2007 — Editland-Navigation mit doSimple Flyout verheiratet
  5. 8.4.2007 — PHP-Arger mit Array_slice

Leave a Reply