tester: bitte um schnelle Hilfe: Array in Array

tag !
komm seit stunden nicht weiter mit diesem problem :-(
gerne würde ich aus dem Textstring etwas derartiges erstellen (aber natürlich ohne eval zu verwenden!):
$str="a|b|c|";
$arr['neue_arrays']['a']['b']['c']=0;

also sowas ahnliches wie rekursiv... nur eben andersrum.
denn zeiger gibts ja nicht in php :-(

evt. könnt Ihr mir einfach einen Begriff/eine Zeile hinzufügen, damit das funktioniert:
$arr_str=split("|",$str);
if(is_array($arr_str))
{
 $arr_neu=0;
 foreach($arr_str AS $name => $nihil)
 {
  $arr_neu[$name]=$arr_neu; //rerekursiv bezeichnungen dranhängen...
 }
//Anbinden an $arr['neue_arrays']
}

vielen dank für Eure hilfe

  1. Hello,

    also sowas ahnliches wie rekursiv... nur eben andersrum.
    denn zeiger gibts ja nicht in php :-(

    Aber dynamische Äquivalenzen, was in einer Interpretersprache dann doch aufs gleiche herauskommt, oder? Man kann eine neue Struktur anlegen und dann den Referenzpunkt an eine andere Struktur übertragen. Man kann auch Arrays of Funktion definieren. Was willst Du mehr?

    Und 'eval()' ist nichts böses, wenn man es richtig einsetzt. Es macht ja prinzipiell nichts anderes als include() und das wird doch immer im Übermaß verwendet. :-((

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. tag !
      auch wenn ich nicht wirklich sagen kann, dass das posting mir geholfen hat, bitte ich nochmal drum, mir zumindest den gesuchten befehl zu nennen, der sowas einfach möglich macht.
      im übrigen wollt ich php nicht kritisieren, sondern klar machen, wie ich es sonst gelöst hätte und wo der hund begraben ist.
      zudem finde ich include nicht wirklich unsicher, da ich keine fremden scripts verwende und auf meine eignen baue ;-)
      danke für einen tipp

  2. Hello,

    $str="a|b|c|";
    $arr['neue_arrays']['a']['b']['c']=0;

    Soll das ein geschachteltes Array werden, ode sollen es mehrere Arrays werden?

    $_arr['new_arrays']['a']
    $_arr['new_arrays']['b']
    $_arr['new_arrays']['c']

    Außerdem wird es ohne eval() nicht gehen. Das ist dafür da. Da Du mit eval ja auch nur eigenen Code umwandeln wirst, ist das genausowenig böse, wie include.

    Es gibt aber auch noch parse_str() http://de2.php.net/manual/en/function.parse-str.php

    Vielleicht hilft Dir das.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. tag!
      nicht
      $_arr['new_arrays']['a']
      $_arr['new_arrays']['b']
      $_arr['new_arrays']['c']
      sondern alles in einem:
      $_arr['new_arrays']['a']['b']['c']

  3. Hallo,

    $str="a|b|c|";
    $arr['neue_arrays']['a']['b']['c']=0;

    function mach($a)
       {
       $a=explode('|',$a,2);
       $b[$a[0]]=(isset($a[1]) && $a[1]!='') ? mach($a[1]) : 0;
       return ($b);
       }

    $arr['neue_arrays']=mach($str);

    Gruß aus Berlin!
    eddi

    --
    wahsaga (http://forum.de.selfhtml.org/archiv/2004/9/90932/#m546295)
    > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
    In dem Sinne: Tassen hoch! Auf die Liebe zwischen Menschen! ;)
    1. tag !
      danke für das beispiel!
      wie kann ich nun den erzeugtem feldern (z.b. $arr[...][a][b][c]) noch den konstanten wert $nr zuweisen?

      danke

      1. habs selbst rausgefunden...
        thx

  4. tag!
    hab hier nun Dank Eurer hilfe ein nicht all zu einfaches script.
    die funktion kategorie2array($kategorie,$nr) hat die aufgabe einen string $kategorie wie z.b. 'foo|bar|bla|...' umzuwandeln in einen array wie $arr_kategorie['foo']['bar']['bla']...['']=$nr;
    diesem array soll vor der rückgabe noch ein blindes feld [''] angehängt werden mit der $nr als wert.
    (dieser vorgang ist nicht erlässlich, da ich die [''] einträge als optionsparameter verwende...)
    und so siehts in php aus:

    <?
    function kategorie2array($kategorie,$nr)
    {
        $kategorie=explode("|",$kategorie,10);
        $kategorie_rest='';
        if(is_array($kategorie)AND(count($kategorie)>1))
        {
            foreach($kategorie AS $i => $kategorie_)
            {
                if($i>0)
                    $kategorie_rest.=$kategorie_.'|';
            }
        }
        if(isset($kategorie[1]) && $kategorie[1]!='')
        {
            $neu=kategorie2array($kategorie_rest,$nr+1);
                $arr_kategorie[$kategorie[0]]=$neu;
        }
        else
        {
            $arr_kategorie[$kategorie[0]]['']=$nr;
        }
        return ($arr_kategorie);
    }
    ?>

    soweit funktioniert es auch.

    doch nun soll dieser vorgang häufiger durchgeführt werden und das ergebniss aller funktionsabläufe in einem gesamten array abgelegt werden:

    <?
    $arr_kategorie_neu[]=kategorie2array("a|aa|aaa|",20);
    $arr_kategorie_neu[]=kategorie2array("a|aa|",20);
    $arr_kategorie_neu[]=kategorie2array("a|",20);
    $arr_kategorie_neu[]=kategorie2array("b|",20);
    $arr_kategorie_neu[]=kategorie2array("c|",20);
    $arr_kategorie_neu[]=kategorie2array("c|cc|",20);
    $arr_kategorie_neu[]=kategorie2array("c|cc|ccc|",20);
    foreach($arr_kategorie_neu AS $arr_kategorie)
    {
        $arr_alles=array_merge($arr_kategorie,$arr_alles);
    }
    print_r($arr_alles);
    ?>

    doch das ergebnis ist nicht wie erwartet.
    testet am besten selbst, wenn Ihr mir nicht glaubt, dass es scheitert.
    so sieht die rüeckgabe aus:
    Zitat:

    Array
    (
    [c] => Array
    (
    [] => 20
    )

    [b] => Array
    (
    [] => 20
    )

    [a] => Array
    (
    [aa] => Array
    (
    [aaa] => Array
    (
    [] => 22
    )

    )

    )

    )

    VIELEN DANK für erkannten fehler und
    NOCH MEHR DANK für einen lösungsvorschlag.

    PS: einiges in dem script mag einigen überflüssig erscheinen, ist jedoch erforderlich, da der spass noch lange nicht vollendet ist, sondern noch erweitert wird...

    1. Tach tester,

      <?
      function kategorie2array($kategorie,$nr)
      {
          $kategorie=explode("|",$kategorie,10);
          $kategorie_rest='';
          if(is_array($kategorie)AND(count($kategorie)>1))
          {
              foreach($kategorie AS $i => $kategorie_)
              {
                  if($i>0)
                      $kategorie_rest.=$kategorie_.'|';
              }
          }
          if(isset($kategorie[1]) && $kategorie[1]!='')
          {
              $neu=kategorie2array($kategorie_rest,$nr+1);
                  $arr_kategorie[$kategorie[0]]=$neu;
          }
          else
          {
              $arr_kategorie[$kategorie[0]]['']=$nr;
          }
          return ($arr_kategorie);
      }
      ?>

      diese Deine Funktion kategorie2array() ist 2.5 langsamer als folgender, gleichwertiger Steuerfluß:

      function kategorie2array($kategorie,$nr)
          {
          $kategorie=explode("|",$kategorie,2);

      if(isset($kategorie[1]) && $kategorie[1]!='')
              $arr_kategorie[$kategorie[0]]=kategorie2array($kategorie[1],$nr+1);
          else $arr_kategorie[$kategorie[0]]['']=$nr;

      return ($arr_kategorie);
          }

      PS: einiges in dem script mag einigen überflüssig erscheinen, ist jedoch erforderlich, da der spass noch lange nicht vollendet ist, sondern noch erweitert wird...

      Achso, erst mal alles niedertippen und dann mal wieder so ein post scriptum. LEUTE HÖRT ENDLICH AUF MIT DIESEM SCHWACHSINN. MAN GIBT SICH HIER MÜHE FÜR DIE KATZE! SELBER MITDENKEN UND POST SCRIPTA AN DIE PASSENDEN PASSAGEN EINFÜGEN! DIESE METHODE NENNT SICH COPY AND PASTE...

      doch das ergebnis ist nicht wie erwartet.
      testet am besten selbst, wenn Ihr mir nicht glaubt, dass es scheitert.
      so sieht die rüeckgabe aus:

      Das Ergibnis ist dem Steuerfluß entsprechend wie erwartet!

      Du willst sicher folgendes haben:

      function kategorie2array($kategorie,$nr)
          {
          $kategorie=explode("|",$kategorie,2);

      if(isset($kategorie[1]) && $kategorie[1]!='')
              $arr_kategorie[$kategorie[0]]=kategorie2array($kategorie[1],$nr+1);

      $arr_kategorie[$kategorie[0]]['']=$nr;

      return ($arr_kategorie);
          }

      Array
      (
          [c] => Array
              (
                  [] => 20
              )

      [b] => Array
              (
                  [] => 20
              )

      [a] => Array
              (
                  [aa] => Array
                      (
                          [aaa] => Array
                              (
                                  [] => 22
                              )

      [] => 21
                      )

      [] => 20
              )

      )

      Gruß aus Berlin!
      eddi

      --
      wahsaga (http://forum.de.selfhtml.org/archiv/2004/9/90932/#m546295)
      > vielleicht könnte man für heteros eine "strict"-DTD zu grunde legen [...oder...] eine darauf anwendbare CSS-eigenschaft 'sex'
      In dem Sinne: Tassen hoch! Auf die Liebe zwischen Menschen! ;)
      1. tag eddi!
        danke!
        nun scheint es zwar besser zu funktionieren;
        aber warum werden nicht alle einträge korrekt verarbeitet?

        $arr_kategorie_neu[]=kategorie2array("a|aa|aaa|",20);
        $arr_kategorie_neu[]=kategorie2array("a|aa|",20);
        $arr_kategorie_neu[]=kategorie2array("a|",20);
        $arr_kategorie_neu[]=kategorie2array("b|",20);
        $arr_kategorie_neu[]=kategorie2array("c|",20);
        $arr_kategorie_neu[]=kategorie2array("c|cc|",20);
        $arr_kategorie_neu[]=kategorie2array("c|cc|ccc|",20);

        bei der rüchgabe scheinen die letzten 2 einträge nicht behandelt worden zu sein!

        Array
        (
            [c] => Array
                (
                    [] => 20
                )

        [b] => Array
                (
                    [] => 20
                )

        [a] => Array
                (
                    [aa] => Array
                        (
                            [aaa] => Array
                                (
                                    [] => 22
                                )

        [] => 21
                        )

        [] => 20
                )

        )

        was ist passiert mit [c][cc]... ?

        danke  für Deine hilfe!

        1. RE:

          setze $arr_alles statt Deines konstruktes so zusammen:

          function pruefe($v)
           {
           if(is_array($v))
            foreach($v as $k=>$x)
             $t.=$k.'²';

          return(count(explode('²',$t)));
           }

          function mach($a,$b)
           {
           if(is_array($a))
            foreach($a as $k=>$v)
             $b[$k]=(pruefe($a[$k])>pruefe($b[$k])) ? $a[$k] : mach($a[$k],$b[$k]);

          return($b);
           }

          for($i=0;$arr_kategorie_neu[$i];$i++)
              {
              $arr_alles=mach($arr_kategorie_neu[$i],$arr_alles);
              }

          Array
          (
              [a] => Array
                  (
                      [aa] => Array
                          (
                              [aaa] => Array
                                  (
                                      [] => 22
                                  )

          [] => 21
                          )

          [] => 20
                  )

          [b] => Array
                  (
                      [] => 20
                  )

          [c] => Array
                  (
                      [cc] => Array
                          (
                              [ccc] => Array
                                  (
                                      [] => 22
                                  )

          [] => 21
                          )

          [] => 20
                  )

          )

          Gruß aus Berlin!
          eddi

  5. Hallo ihr da draußen,

    Was mich noch interessieren würde:
    Ist folgende Lösung auch möglich/gut/schlecht/sinnvoll/unsinnig?

    $str = "a|b|c|";
    $values = explode("|", $str);
    $new_arr = array();
    $new_arr_ref = & $new_arr;

    foreach($values as $value)
    {
       $new_arr_ref[$value] = array();
       $new_arr_ref = & $new_arr_ref[$value]; // Oder überschreibt dies etwa auch $new_arr?
    }

    Grüße von hier drinnen, aus Biberach an der Riss,
    Candid Dauth (Dogfish)

    --
    »Bismarck biss Mark, bis Mark Bismarck biss!«
    http://cdauth.net.tc/
    ie:{ fl:( br: va:} ls:[ fo:| rl:( n4:( ss:) de:> js:( ch:| sh:( mo:) zu:|