php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 02.04.2009, 00:20  
Neuer Benutzer
 
Registriert seit: 10.01.2009
Beiträge: 7
erselbst befindet sich auf einem aufstrebenden Ast
Standard Array umwandeln von zwei zu mehrdimensional

Hallo, kann mir jemand helfen wie ich ein Zwei Dimensionales Array in ein Mehr Dimensionales Array umwandeln kann?

Folgendes Array wird aus einer DB gelesen:

PHP-Code:
(array) $array1 = array(
    array( 
'id' => 1'child' => 0'name' => 'Coding' ),
    array( 
'id' => 2'child' => 1'name' => 'Bash' ),
    array( 
'id' => 3'child' => 1'name' => 'JavaScript' ),
    array( 
'id' => 4'child' => 3'name' => 'Ajax' ),
    array( 
'id' => 5'child' => 1'name' => 'Perl' ),
    array( 
'id' => 6'child' => 1'name' => 'PHP' ),
    array( 
'id' => 7'child' => 0'name' => 'Grafik' ),
    array( 
'id' => 8'child' => 7'name' => 'Icons' ),
    array( 
'id' => 9'child' => 7'name' => 'Templates' ),
    array( 
'id' => 10'child' => 0'name' => 'Unix/Linux' ),
    array( 
'id' => 11'child' => 10'name' => 'Apache' ),
    array( 
'id' => 12'child' => 10'name' => 'Bind9' ),
    array( 
'id' => 13'child' => 10'name' => 'Mail' ),
    array( 
'id' => 14'child' => 13'name' => 'Postfix' ),
    array( 
'id' => 15'child' => 14'name' => 'Manual' ),
    array( 
'id' => 16'child' => 14'name' => 'Tutorial' ),
    array( 
'id' => 17'child' => 13'name' => 'Sendmail' ),
    array( 
'id' => 18'child' => 10'name' => 'Samba' ),
    array( 
'id' => 19'child' => 10'name' => '8' ),
); 
Das obere Array soll in folgendes Array umgewandelt werden:

PHP-Code:
(array) $array2 = array(
    array( 
'id' => 1,
        
'name' => 'Coding',
        array( 
'id' => 2,
            
'name' => 'Bash'
        
),
        array( 
'id' => 3,
            
'name' => 'JavaScript',
            array( 
'id' => 4,
                
'name' => 'Ajax'
            
)
        ),
        array( 
'id' => 5,
            
'name' => 'Perl'
        
),
        array( 
'id' => 6,
            
'name' => 'PHP'
        
)
    ),
    array( 
'id' => 7,
        
'name' => 'Grafik',
        array( 
'id' => 8,
            
'name' => 'Icons'
        
),
        array( 
'id' => 9,
            
'name' => 'Templates'
        
)
    ),
    array( 
'id' => 10,
        
'name' => 'Unix/Linux',
        array( 
'id' => 11,
            
'name' => 'Apache'
        
),
        array( 
'id' => 12,
            
'name' => 'Bind9'
        
),
        array( 
'id' => 13,
            
'name' => 'Mail',
            array( 
'id' => 14,
                
'name' => 'Postfix',
                array( 
'id' => 15,
                    
'name' => 'Manual'
                
),
                array( 
'id' => 16,
                    
'name' => 'Tutorial'
                
)
            ),
            array( 
'id' => 17,
                
'name' => 'Sendmail'
            
)
        ),
        array( 
'id' => 18,
            
'name' => 'Samba'
        
),
        array( 
'id' => 19,
            
'name' => 8
        
)
    )
); 
Hat jemand eine Idee wie ich das realisieren kann?
erselbst ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 02.04.2009, 03:05  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

eine Möglichkeit:
PHP-Code:
<?php
$array1 
= array(
  array( 
'id' => 1'child' => 0'name' => 'Coding' ),
  array( 
'id' => 2'child' => 1'name' => 'Bash' ),
  array( 
'id' => 3'child' => 1'name' => 'JavaScript' ),
  array( 
'id' => 4'child' => 3'name' => 'Ajax' ),
  array( 
'id' => 5'child' => 1'name' => 'Perl' ),
  array( 
'id' => 6'child' => 1'name' => 'PHP' ),
  array( 
'id' => 7'child' => 0'name' => 'Grafik' ),
  array( 
'id' => 8'child' => 7'name' => 'Icons' ),
  array( 
'id' => 9'child' => 7'name' => 'Templates' ),
  array( 
'id' => 10'child' => 0'name' => 'Unix/Linux' ),
  array( 
'id' => 11'child' => 10'name' => 'Apache' ),
  array( 
'id' => 12'child' => 10'name' => 'Bind9' ),
  array( 
'id' => 13'child' => 10'name' => 'Mail' ),
  array( 
'id' => 14'child' => 13'name' => 'Postfix' ),
  array( 
'id' => 15'child' => 14'name' => 'Manual' ),
  array( 
'id' => 16'child' => 14'name' => 'Tutorial' ),
  array( 
'id' => 17'child' => 13'name' => 'Sendmail' ),
  array( 
'id' => 18'child' => 10'name' => 'Samba' ),
  array( 
'id' => 19'child' => 10'name' => '8' ),
);

$tmp = array();
$array2 = array();
foreach(
$array1 as $e) {
  
$tmp[$e['id']] = $e;
  if ( 
0==$e['child'] ) {
    
$array2[] = &$tmp[$e['id']];
  }
  else if ( !isset(
$tmp[$e['child']]) ) {
    die(
'Elternknoten (noch) nicht bekannt');
  }
  else {
    
$tmp[$e['child']][] = &$tmp[$e['id']];
  }
}
unset(
$tmp);

print_r($array2);
David ist offline  
Alt 02.04.2009, 14:17  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich habe das auch schon öfter mit Referenzen versucht und gemacht, finde das aber sehr fehleranfällig und schwer zu debuggen. Ich würde dazu raten, die Datensätze absteigend nach Parent-ID zu sortieren und diese immer als Arrayschlüssel zu verwenden. Später diese Arrays als Kinddatensatz der entspr. ID zuordnen, wenn diese "dran" ist.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 02.04.2009, 22:59  
Neuer Benutzer
 
Registriert seit: 10.01.2009
Beiträge: 7
erselbst befindet sich auf einem aufstrebenden Ast
Standard

Hmm, das Beispiel funktioniert aber nur, wenn die id's und child's in der korrekten Reihenfolge sind. Wenn ich aber z.B. Ajax (id=>4, child=>3) nach Grafik (child=>7) verschiebe, tritt der Fall mit dem unbekannten Elternknoten ein.

Gibt es nicht noch eine Möglichkeit es unabhängig von der Reihenfolge von id und child zu machen?
erselbst ist offline  
Alt 02.04.2009, 23:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Welches Beispiel? Davids? Klar, Du mußt schon Deine DB anweisen, die passende Reihenfolge zu liefern.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 02.04.2009, 23:13  
Neuer Benutzer
 
Registriert seit: 10.01.2009
Beiträge: 7
erselbst befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Welches Beispiel? Davids? Klar, Du mußt schon Deine DB anweisen, die passende Reihenfolge zu liefern.
Ja, Davids Beispiel meine ich. In diesem Beispiel muss die id immer größer sein als child, sonst funktioniert es nicht.
erselbst ist offline  
Alt 02.04.2009, 23:30  
Neuer Benutzer
 
Registriert seit: 10.01.2009
Beiträge: 7
erselbst befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von David Beitrag anzeigen
eine Möglichkeit:
PHP-Code:
<?php
$array1 
= array(
  array( 
'id' => 1'child' => 0'name' => 'Coding' ),
  array( 
'id' => 2'child' => 1'name' => 'Bash' ),
  array( 
'id' => 3'child' => 1'name' => 'JavaScript' ),
  array( 
'id' => 4'child' => 3'name' => 'Ajax' ),
  array( 
'id' => 5'child' => 1'name' => 'Perl' ),
  array( 
'id' => 6'child' => 1'name' => 'PHP' ),
  array( 
'id' => 7'child' => 0'name' => 'Grafik' ),
  array( 
'id' => 8'child' => 7'name' => 'Icons' ),
  array( 
'id' => 9'child' => 7'name' => 'Templates' ),
  array( 
'id' => 10'child' => 0'name' => 'Unix/Linux' ),
  array( 
'id' => 11'child' => 10'name' => 'Apache' ),
  array( 
'id' => 12'child' => 10'name' => 'Bind9' ),
  array( 
'id' => 13'child' => 10'name' => 'Mail' ),
  array( 
'id' => 14'child' => 13'name' => 'Postfix' ),
  array( 
'id' => 15'child' => 14'name' => 'Manual' ),
  array( 
'id' => 16'child' => 14'name' => 'Tutorial' ),
  array( 
'id' => 17'child' => 13'name' => 'Sendmail' ),
  array( 
'id' => 18'child' => 10'name' => 'Samba' ),
  array( 
'id' => 19'child' => 10'name' => '8' ),
);

$tmp = array();
$array2 = array();
foreach(
$array1 as $e) {
  
$tmp[$e['id']] = $e;
  if ( 
0==$e['child'] ) {
    
$array2[] = &$tmp[$e['id']];
  }
  else if ( !isset(
$tmp[$e['child']]) ) {
    die(
'Elternknoten (noch) nicht bekannt');
  }
  else {
    
$tmp[$e['child']][] = &$tmp[$e['id']];
  }
}
unset(
$tmp);

print_r($array2);

Ich denke so sollte es gehen. Nochmal Vielen Danke für Eure Hilfe:

PHP-Code:
function tree ( &$arr ) {

(array) 
$tmp = array();
(array) 
$data = array();
(array) 
$unknown = array();

foreach( 
$arr as $val ) {
    
$tmp[$val['id']] = $val;
    if ( 
== $val['child'] ) {
        
$data[] = &$tmp[$val['id']];
    } else if ( !isset(
$tmp[$val['child']]) ) {
        
// Elternknoten (noch) nicht bekannt
        
$unknown[] = $val;
    } else {
        
$tmp[$val['child']][] = &$tmp[$val['id']];
    }
}

// Fehlende Elternknoten Wert zuweisen
if ( count($unknown) > ) {
    foreach ( 
$unknown as $val )
        
$tmp[$val['child']][] = &$tmp[$val['id']] ;
}

unset(
$tmp);
unset(
$unknown);
return 
$data;


erselbst ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Array mit implode in String umwandeln franc PHP Tipps 2008 14 21.12.2008 18:05
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Soapfault: Undefined Property Argi PHP-Fortgeschrittene 0 28.07.2008 11:17
String bei Zeichen X trennen und in array umwandeln MeisterGlanz PHP Tipps 2006 5 13.09.2006 15:28
Übersicht aus mehrdimensionalem Array erzeugen Crypi PHP-Fortgeschrittene 0 30.01.2006 13:44
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Array Formatierung PHP Tipps 2006 3 17.01.2006 19:12
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
eindimensionales array in zweidimensionales array umwandeln PHP Tipps 2005-2 6 20.07.2005 16:09
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03
[Erledigt] Mehrdimensionales Array in eindimensionales Array umwandeln PHP-Fortgeschrittene 3 03.01.2005 22:31
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25
String in Array umwandeln PHP Tipps 2004-2 15 24.11.2004 16:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
perl array mehrdimensional, bash array mehrdimensional, perl mehrdimensionale arrays, bash mehrdimensionales array, bash mehrdimensionale arrays, http://www.php.de/php-einsteiger/53656-array-umwandeln-von-zwei-zu-mehrdimensional.html, bash mehrdimensionale array, php array umwandeln, mehrdimensionale arrays perl, perl mehrdimensionales array, bash zweidimensionales array, mehrdimensionale arrays bash, bash zweidimensionale arrays, php array mehrdimensional, bash array 2 dimensional, array mehrdimensional, perl mehrdimensionale array, php aus string mehrdimensionales array erstellen, php array mehrdimensional erstellen, perl dreidimensionales array

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:28 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum