Ankündigung

Einklappen
Keine Ankündigung bisher.

Tupel aus einem Array mit foreach rausholen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tupel aus einem Array mit foreach rausholen?

    hi,

    ich grübele nun schon seit gestern Mittag an einer Lösung, die mir partout nicht in Kopf möchte.

    Ich habe ein Array
    Code:
    Array  
    (
      [12]=>Array
                (
                  [2]=>Inkognito
                  [6]=>TheKing
                  [9]=>Vister
                  [...]=> ...
                  [1]=>Dummy
                  [count]=>3      //is always there
                 )
    
       [67]=>Array
                (
                  [3]=>Inser
                  [5]=>ThePorter
                  [9]=>Vister
                  [count]=>1      //is always there
                 )
    )
    Aus diesem Array muss ich jetzt die folgende Struktur bekommen
    Code:
    //Nodes
    <Person id=2 name=Inkognito>
    <Person id=6 name=TheKing>
    <...>
    <Person id=9 name=Vister>
    
    //Edges
    <Edge fromID=2 toID=6 linesize=3>
    <Edge fromID=6 toID=9 linesize=3>
    <...>
    <Edge fromID=3 toID=9 linesize=1>
    Die Knoten (Person) bekomme ich wunderbar hin, für die Kanten fehlt mir immer noch jede Idee

    Code:
    foreach($input as $value){
       //betrachtet nur  Arrays mit min. 2 Elementen neben count
       if(count($value)>2){  
          foreach($value as $ikey=>$ivalue){
             if ($ikey!=="count"){
    	    $xmlnode .= '<Person id="'.$ikey.'" name="'.$ivalue.'"/>';
    	    $xmlrelation .= '??????'; // wie komme ich an den $ikey-next?
             }else{
                $xmlrelation .= '??????'; // hier müsste das linesize Attribut der Kante angehängt werden
             }
         }
       }
    }
    Ich hoffe es kann mir jm. helfen
    Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de


  • #2
    Wie ist denn das Prinzip der Verbindung? Aufeinanderfolgende, alle mit allen oder wie?
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Alle mit Allen
      Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

      Kommentar


      • #4
        Z.B. mit einen $lastkey , der vor den foreach null und am Ende der Schleife mit dem aktuellen key initialisiert wird. Dann immer $lastkey - $ikey speichern.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          $ikey ist nicht kontinuierlich aus (1...n). Es ist die ID des Users und steht nicht für den INDEX des Arrays.

          Oder sollte ich dann die Struktur des Arrays nochmal überdenken?
          Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

          Kommentar


          • #6
            $ikey ist nicht kontinuierlich aus (1...n). Es ist die ID des Users und steht nicht für den INDEX des Arrays.
            Schon klar.
            Alle mit Allen
            stand da nicht eben was anderes?

            unset ($value['count']);
            myFunction ($value);

            In myFunction mußt Du einen Algorithmus umsetzen, der in einem Array alle Elemente als paarweise Kombination abbildet
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Danke, ich sehe wieder ein Licht am Horizont!

              ja, da stand eben was anderes. Nachdem ich die Antwort geschrieben habe ist mir in den Sinn gekommen, dass es gar nicht stimmt. Die Relation besagt, dass diese User alle an einem Artikel mitgeschrieben haben und damit alle miteinander eine Gemeinsamkeit haben.

              Danke für das unset! Das kannte ich noch nicht!
              Existiert denn so ein Algorithmus? Ich habe gerade ein wenig gesucht, kann aber keinen Namen finden.
              Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

              Kommentar


              • #8
                Bestimmt. Ich war jetzt zu faul drüber nachzudenken. Vom Prinzip aber so:
                Code:
                while ($item = array_pop ($array))
                  {
                  // kombiniere $item mit den verbelibenden Elementen von $array und schreibs irgendwo hin
                  }
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  ich sehe nichts hinter Deiner Idee

                  mir fällt nur ein Kreuzprodukt ein
                  Code:
                  foreach ($value as $ikey=>$ivalue){
                     foreach ($value as $jkey=>$jvalue){
                        echo($ikey.':'.$jkey);
                     }
                  }
                  aber dann habe ich leider ja auch doppelte Abbildungen
                  Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

                  Kommentar


                  • #10
                    ah, jetzt ja, jetzt dämmerts

                    Code:
                    while ($item=array_pop($value)){
                       foreach ($value as $jvalue){
                          echo($item.':'.$jvalue.' - ');
                       }
                    }
                    Wie kann man nun das Problem lösen, auf die keys anstatt die values zuzugreifen?

                    array_pop() liefert leider nur das value, nicht den key
                    Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

                    Kommentar


                    • #11
                      Naja, hatte es im Kopf ja eh halb fertig. Nimmste noch array_keys () dazu ...
                      PHP-Code:
                      <?
                      $items = array ();

                      $array = array (1 , 3 , 5 , 8);
                      while (true)
                        {
                        $item = array_shift ($array);
                        if (empty ($array)) break;
                        
                        $items = array_merge ($items , array_map (null , $array, array_fill (0 , count ($array) , $item)));
                        }
                        
                      print_r($items);
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Hi danke!
                        Auch wenn Dein Skript nicht mehr so richtig verstehe und das Beispiel sehr gut funktioniert bleibt das Problem der keys immer noch.

                        Code:
                        $item = array_shift ($value);
                        array_shift liefert hier wieder nur das value und wenn ich beim mergen der beiden Arrays den Index des Wertes($item) haben möchte, geht dies ja nicht mehr.
                        Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

                        Kommentar


                        • #13
                          PHP-Code:
                          myFunction (array_keys ($value)); 
                          Kurz zum Verständnis:
                          - array_shift () holt in einer Schleife stets das erste Element des Arrays (welches dabei um dieses Element reduziert wird).
                          - das passiert solange, bis das letzte Element entnommen wurde
                          - das letzte Element wird nicht mehr verarbeitet - es gib nichts mehr zuzuordnen - break;

                          $items = array_merge ($items , ...
                          erweitert das Array $items um das folgende:

                          array_map (null , $array1 , $array2) liefert ein Array mit n Elementen, wobei jedes Element wiederum ein Array aus je einem Eintrag aus $array1 und $array2 ist.
                          Gleichbedeutend:
                          each (array1 as key=>tmp)
                          result[] = { array1[key] , array2[key] }

                          Als zweite (Kombinations-)menge wird ein Array aus n Einträgen $item gebildet.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            das funktioniert jetzt soweit, allerdings bekomme ich mittels eines Kreuzprodukts weniger Elemente als mit dieser Variante?!?!
                            argh....das ist schon echt zu hoch für mich

                            Kreuzprodukt:
                            Code:
                            function makeXML($input){
                               global $wgOut;
                               $xmlrelation='';
                            	
                               foreach($input as $value){
                            	if(count($value)>2){
                            		$count=$value['count'];
                            		unset($value['count']);
                            
                            		foreach ($value as $ikey=>$ivalue){
                            			foreach ($value as $jkey=>$jvalue)
                            			{
                            				$xmlrelation.='<UndirectedRelation  fromID="'.$ikey.'" toID="'.$jkey.'" lineSize="'.$count.'"/>';
                            			}
                            		}
                            	}
                               }
                               $wgOut->AddWikiText('<pre>'.$xmlrelation.'</pre>');
                            		
                            
                            }
                            Die Andere -- Deine Variante:
                            Code:
                            function makeXML($input){
                            	global $wgOut;
                            	$xmlnode='';
                            	$xmlrelation='';
                            	$items = array ();
                            	
                            	foreach($input as $value){
                            		if(count($value)>2){
                            			$count=$value['count'];
                            			unset($value['count']);
                            		
                            			$value=array_keys($value);
                            		
                            			while (true)
                            			{
                            				$item = array_shift($value);
                            				if (empty ($value)) break;
                            				$items = array_merge ($items , array_map (null , $value, array_fill (0 , count ($value) , $item)));
                            			}
                            		}
                            		foreach($items as $ivalue){
                            			$one=array_pop($ivalue);
                            			$two=array_pop($ivalue);
                            			$xmlrelation.='<UndirectedRelation  fromID="'.$one.'" toID="'.$two.'" lineSize="'.$count.'"/>
                            			';
                            		}	
                            	}
                            	$wgOut->AddWikiText('<pre>'.$xmlrelation.'</pre>');
                            }
                            oder mache ich immer noch was falsch?
                            Hier findet Ihr alles, was ich dank eurer Hilfe geschafft habe und noch mehr: http://viskoda.viktor-dite.de

                            Kommentar


                            • #15
                              1/ Statt:
                              PHP-Code:
                              foreach($items as $ivalue){
                                          
                              $one=array_pop($ivalue);
                                          
                              $two=array_pop($ivalue);
                                          
                              $xmlrelation.='<UndirectedRelation  fromID="'.$one.'" toID="'.$two.'" lineSize="'.$count.'"/>
                                          '

                              das:
                              PHP-Code:
                                          $xmlrelation.='<UndirectedRelation  fromID="'.$items[0].'" toID="'.$items[1].'" lineSize="'.$count.'"/>
                                          '

                              2/
                              $items = array (); vor dem while () nicht vor foreach ()!
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X