Mehrdimensionales Array erzeugen

Hallo Array-Junkys,

habe da ein kleines Problem mit dem der Eine oder Andere vielleicht schon mal gekämpt hat.

Ich habe ein bestehendes Array das ich in ein mehrdimensionales wandeln möchte.

Ausgangslage ist:

Array
(
    [1] => playlist%20index%3A0
    [2] => id%3A44824
    [3] => title%3AUnbreak%20My%20Heart%20(Regresa%20A%20M
    [4] => genre%3AClassic
    [5] => artist%3AIl%20Divo
    [6] => album%3AIl%20Divo
    [7] => duration%3A282.488
    [8] => playlist%20index%3A1
    [9] => id%3A44814
    [10] => title%3AIDentro%20Un%20Altro%20Si
    [11] => genre%3AClassic
    [12] => artist%3AIl%20Divo
    [13] => album%3AIl%20Divo
    [14] => duration%3A274.92
    [15] => playlist%20index%3A2
    [16] => id%3A44820
    [17] => title%3ANella%20Fantasia
    [18] => genre%3AClassic
    [19] => artist%3AIl%20Divo
    [20] => album%3AIl%20Divo
    [21] => duration%3A267.102

Wie man vielleicht sieht wiederholen sich die Werte alle 7 Zeilen und genau hier möchte ich die nächste Dimension haben

Also Ergebnis:

 
Array
(
    [0] =>
            [playlist index] => 0
            [id] => 44824
            [title] => Unbreak%20My%20Heart%20(Regresa%20A%20M
            [genre] => Classic
            [artist] => Il%20Divo
            [album] => Il%20Divo
            [duration] => 282.488
    [1] => 
            [playlist index] => 1
            [id] => 44814
            [title] => IDentro%20Un%20Altro%20Si
            [genre] => Classic
            [artist] => Il%20Divo
            [album] => Il%20Divo
            [duration] => 274.92
usw.

hat hier jemand eine mehrfache Schleife für mich.

Freue mich auf Tipps.

Möchtest du die Array auch mit Inhalt füllen, oder machst du das per Hand?
Auslesen kannst du sie so (gehen wir davon aus, dass sie als „$array“ gespeichert ist):

<?php
foreach($array as $usekey =>$arrayvalue){
   print $arrayvalue[playlist index];
}
?>

oder so:

<?php
foreach($array as $usekey =>$arrayvalue){
   foreach($arrayvalue as $usearraykey =>$usearrayvalue ){
      print $usearraykey.": ".$usearrayvalue;
   }
}
?>

eine Unterarray kannst du so hinzufügen:

<?php
$array=array();  /* Eventuell ausführen */
for($i=0; $i<=5 /*Anzahl an durchläufen*/; $i++){
   $array[]=$data=array('playlist_index'=>'xyz',
                                 'id' => '1234' /* ggf. $i*/);
}
?>

bzw.

<?php
$array=array();  /* Eventuell ausführen */
 for($i=0; $i<=5 /*Anzahl an durchläufen*/; $i++){
    $array[$i]=$data=array('playlist_index'=>'xyz',
                                 'id' => '1234' /* ggf. $i*/);
 }
 ?>

Nicht getestet, könnte aber funktionieren.
Weise auch gerne auf de.php.net hin.


<?

$items = Array
(
    1 => "playlist%20index%3A0",
    2 => "id%3A44824",
    3 => "title%3AUnbreak%20My%20Heart%20(Regresa%20A%20M",
    4 => "genre%3AClassic",
    5 => "artist%3AIl%20Divo",
    6 => "album%3AIl%20Divo",
    7 => "duration%3A282.488",
    8 => "playlist%20index%3A1",
    9 => "id%3A44814",
    10 => "title%3AIDentro%20Un%20Altro%20Si",
    11 => "genre%3AClassic",
    12 => "artist%3AIl%20Divo",
    13 => "album%3AIl%20Divo",
    14 => "duration%3A274.92",
    15 => "playlist%20index%3A2",
    16 => "id%3A44820",
    17 => "title%3ANella%20Fantasia",
    18 => "genre%3AClassic",
    19 => "artist%3AIl%20Divo",
    20 => "album%3AIl%20Divo",
    21 => "duration%3A267.102"
);

$arr = Array();
foreach($items as $item)
{
	$item = urldecode($item);
	$chunks = explode(":", $item);
	if($chunks[0] == "playlist index")
	{
	   $aitem = &$arr[];
	}
	$aitem[$chunks[0]] = $chunks[1];
}
print_r($arr);
    
?>

Grüße,
paresy

Hallo Tobias,
Hallo paresy,

Vielen Dank für eure Tipps. Wenn ich das richtig verstehe dann komme ich mit paresys Ansatz dort hin wo ich will, muss es halt nur um die entsprechenden Chunks erweitern.

Werde es morgen gleich mal testen.

Ich hatte sowas ähnliches (wie paresy) gemacht. Ich wollte eine Liste als Objekt-Konstruktion interpretieren.

Um da ganz dynamisch und unabhängig von jeder Kennung zu sein, die ein Objekt „einleitet“ (hier: „playlist index“) habe ich - anders als paresy - den Objektkenner plus Objektname (hier „playlist index“ & nr) als ersten Key eines assoziativen Arrays genommen. Die Keys der zweiten Ebene beschreiben dann das Objekt (hier: id, title, genre etc).

Musst nur nch Dein Array in der Zeite $ARRAY = ?? einsetzen.


// ARRAY TO CONTAIN THE OBJECTS DEFINITION & CONTENTS
	$ARRAY = ?? // MODIFY HERE
	print_r( ACVITI_ListToObject( $ARRAY, ":" ) );




function ACVITI_ListToObject( $arr, $deli = "|" )
{
	// DEFINE OBJECTS ARRAY --> EACH OBJECT WILL BE ONE ARRAY ELEMENT
	//		WITH PROPERTIES BEING THE ARRAY ON SECOND LEVEL
	//    FIRST LINE DEINES THE START-IDENTIFIER OF EACH OBJECT
		$f['deli'] = $deli;
		$f['arr'] = $arr;
		$f['ObjectsArr'] = Array();

	// WALK ALL DEFINITION LINES
		$i = 0;
		foreach($arr as $f['arr_item'])
		{
			$f['items'] = explode($f['deli'], urldecode($f['arr_item']));
			if( count( $f['items'] ) == 1 )
			{
				$f['key'] = $f['items'][0];
				$f['value'] = "";
			}else{
				$f['key'] = $f['items'][0];
				$f['value'] = $f['items'][1];
			};
			// FIRST LINE DEFINES THE RECURRING START-IDENTIFIER FOR OBJECTS
			if( $i==0 )
			{
			    $f['NewObjectIdentifier'] = $f['key'];
			};

			if($f['key'] == $f['NewObjectIdentifier'])
			{
				// START A NEW OBJECT INDEX IN OBJECTS ARRAY
					$f['ObjectName'] = $f['key'] . " " . $f['value'];
			}else{
				// SUPPLY PROPERTIES OF OBJECT ONE BY ONE
					$f['ObjectsArr'][ $f['ObjectName'] ][ $f['key'] ] = $f['value'];
			};
			$i++;
		};
	//end WALK ALL DEFINITION LINES

	return( $f['ObjectsArr'] );
};

Hallo jwka,

alleine schon wegen der Komplexität muß ich deine Funktion mal testen.

Uups??
Was isn da komplex??

Bloss, weil ich gerne mit Arrays statt Variablen arbeite (das hat beim debug den großen Vorteil, dass print_r alles mit einer einzigen code-Zeile ausgibt) ist das doch alles noch nicht komplex! Es ist ne einfache Loop …

Ok, da die Funktion ne allgemeine sein sollte (ich mache nach Möglichkeit immer wiederverwendbaren code), braucht’s halt schon mal ein paar Zeilen „mehr“ - aber wenn Du die Definition der „Kennung neu“, den Doppelpunkt als variablen Trenner und die Kommentare weglässt, ist der Code unwesentlich länger als die andern codes hier …

Du musst im Prinzip nur $f[ (functiondata) nicht lesen … schon ist’s wie wenn Du ne Variable nutzen würdest. Da sich das $f[ machmal auf den ersten Blick wie ein „if“ liest, nehme ich inzwischen $af[ …

jwka

Ob etwas komplex ist oder nicht liegt immer im Auge des Betrachters :wink:

Bis dato habe ich mehrdimensionale Array nur gelesen, aber selbst eines über eine Schleife erzeugen hatte ich noch nie gemacht, deshalb im ersten Schritt ein wenig komplex für mich.

Beim nächsten mal wird es schon einfacher :smiley:

Ich hatte Anfangs auch ein bisschen „Regatt“ vor Arrays.

Aber ich kann jedem wirklich nur empfehlen, sich mal die Zeit zu nehmen (ein oder zwei Stunden reichen übrig), mit Arrays rumzuspielen und sich klar zu machen, wie die funktionieren. Es ist genial einfach und hilft ungemein, wenn man etwas umfangreichere Daten hat.

Auch die Arrayfunktionen könneneinem das Leben in vielen Fällen wesentlich erleichtern und ellenlange Litaneien auf wenige Codezeilen reduzieren.

Mal sehen, vielleicht finde ich mal ein paar Minuten Muse, um ein Tutorial zu schreiben. Vielleicht hilft das ja vielen hier (gibt es daran Interesse ???). Ich hatte bislang den Eindruck, dass ich der einzige war, der vor Arrays zurückgeschreckt ist …

jwka

Array sind ja ansich nicht wirklich schwierig.

Alleine mit den Rückmeldung diverser IPS_Get-Befehle ist man ja schon gezwungen mit Arrays zu arbeiten.

Was mir hier einfach schwerfällt ist die Splittung der regelmäßigen Wiederholung nach 7 Zeilen in eine 2. Ebene des Arrays.

Lassen wir uns erst einmal überraschen ob die Skriptvorschläge mein Problem beseitigen.

Hast du dir mein Skript angesehen? Das ist getestet und funktioniert so, wie du es willst. Du musst da auch nix erweitern. Reinkopieren, fertig :smiley:

paresy

Angesehen ja, probiert nein, war heute noch nicht in meinen heiligen Kellergewölben.

Und. Klar funktionieren deine Skripte, Du gibst nie was ungetestetes raus.

Danke nochmals.

Immer klingt ganz schön übertrieben :smiley:

Das Konstrukt $a = &$b; ist hier die ganze Magie, die das Skript so kurz macht. Ist vielleicht Wert sich mal mit Referenzen und PHP auseinander zu setzen, wer das Konzept verstehen willt :slight_smile:

Grüße aus dem total eingeschneiten Sarkwitz,
paresy

Hallo paresy,

Ist vielleicht Wert sich mal mit Referenzen und PHP auseinander zu setzen

was meinst Du was ich gestern Abend gemacht habe bevor ich um Hilfe gebeten habe :wink:

Das letzte was ich versuche ist im Forum zu fragen, das verbietet mir mein Ehrgeiz :smiley:

Was mir hier manchmal fehlt ist das mehrdimensionale Gen, das fehlt mir auch bei Spielen bei denen ich mich orientieren muß :smiley:

Nachmals vielen Dank.

Das war so nicht gemeint :D. Aber mir war es eine Ehre helfen zu können. Deine Frage hätte man aber auch anders lösen können. Weniger High-Tech, mit aber mehr Zeilen :smiley: Mein Satz war nur für dich gedacht, damit du meine Lösung nachlesen kannst, falls dich interessiert, was es mit dem & auf sich hat :slight_smile:

Fragen kann doch hier jeder. Sogar ich tue das manchmal :slight_smile:

paresy

Schon klar paresy, leider kann man es in Textform oft nicht so ausdrücken wie man es meint aber statt dem IPS-Logo mußt Du dir nur dich vorstellen.:loveips: