PHP assoziatives Array sortieren (nach Index)

Fragen zum Thema HTML, JavaScript, PHP
HerrKlinke
Verifiziert
Beiträge: 76
Registriert: Do Sep 04, 2008 2:12 pm
Wohnort: Wismar
Kontaktdaten:

PHP assoziatives Array sortieren (nach Index)

Beitrag von HerrKlinke » Do Nov 24, 2011 6:23 am

Hi,
also ich habe ein mehrdimensionales, assoziatives Array mit 2 bis 4 Dimensionen.
Typisch sind aber 3.

Jetzt möchte ich die 1. Ebene nach den Index-Strings sortieren lassen. Und dann für jedes Unterarray auch diese Sortierung vornehmen.
Wie erreiche ich das?

Ich dachte an eine Lösung wie etwa:

Code: Alles auswählen

sortiere($array)  // 1. Dimension sortieren
foreach($array as &$element) {
   sortiere $element  // 2. Dimension sortieren
}
Nur ich glaube, dass die nativen PHP Sortierfunktionen nicht wirklich nach dem Index gehen, sondern nach den Werten.
Bei meinem Array ist aber schon der Index eine Art Wert.
Es ist ein Kategorie, Unterkategorie Stammbaum in denen dann schließlich Daten sind.
Die Kategorienamen tauchen leider ausschließlich im Index auf, und nach denen möchte ich sortieren.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von C@mper » Do Nov 24, 2011 8:16 am

Hilft Dir das?

Code: Alles auswählen


//---------------------------------------------------------------------------
//- Name		:	SortAssocArrayByMultipleKeys							-
//- Descript	:	Assoziatives Array Sortieren.							-
//-						Es kann nach mehreren Keys gleichzeitig und 		-
//-						case sensitiv sortiert werden.						-
//-																			-
//-			-------------------------------------------------------			-
//-																			-
//-	Example		:	$aMuster[0]['Name']  = 'Anton';							-
//-					$aMuster[0]['Alter'] = '51';							-
//-					$aMuster[1]['Name']  = 'Nonym';						-
//-					$aMuster[1]['Alter'] = '54';							-
//-					$aMuster[2]['Name']  = 'Dow';						-
//-					$aMuster[2]['Alter'] = '55';							-
//-																			-
//-					$aSortOptions[0]['name'] = 'Name'; 						-
//-					$aSortOptions[0]['sort'] = "ASC";						- 
//-					$aSortOptions[0]['case'] = "TRUE";						- 
//-																			-
//-					$aSortOptions[1]['name'] = 'Alter'; 					-
//-					$aSortOptions[1]['sort'] = "DESC";						- 
//-					$aSortOptions[1]['case'] = "FALSE";						- 
//-																			-
//-					SortAssocArrayByMultipleKeys($aMuster, $aSortOptions);	-
//-																			-
//-			-------------------------------------------------------			-
//-																			-
//- Args		:	(array)	$aArray		  - (Adresse) zu sortierendes Array	-
//-					(array)	$aSortOptions - Sortier Optionen				-
//- Ret-Values	:	keine (void)											-
//- created		:	14.07.2009 - BF  									-
//- changes		:															-
//---------------------------------------------------------------------------

function SortAssocArrayByMultipleKeys(&$aArray, $aSortOptions = array()) 
{
	$sFunction = '';									// String nimmt den kompl. Funktionsinhalt auf

	while (list($key) = each($aSortOptions)) 
	{
		if (isset($aSortOptions[$key]['case']) && ($aSortOptions[$key]['case'] == TRUE)) 
			$sFunction .= 'if (strtolower($a["' . $aSortOptions[$key]['name'] . '"])<>strtolower($b["' . $aSortOptions[$key]['name'] . '"])) { return (strtolower($a["' . $aSortOptions[$key]['name'] . '"]) ';
		else 
			$sFunction .= 'if ($a["' . $aSortOptions[$key]['name'] . '"]<>$b["' . $aSortOptions[$key]['name'] . '"]) { return ($a["' . $aSortOptions[$key]['name'] . '"] ';

		if (isset($aSortOptions[$key]['sort']) && ($aSortOptions[$key]['sort'] == "DESC")) 
			$sFunction .= '<';
		else 
			$sFunction .= '>';

		if (isset($aSortOptions[$key]['case']) && ($aSortOptions[$key]['case'] == TRUE)) 
			$sFunction .= ' strtolower($b["' . $aSortOptions[$key]['name'] . '"])) ? 1 : -1; } else';
		else 
			$sFunction .= ' $b["' . $aSortOptions[$key]['name'] . '"]) ? 1 : -1; } else';
	}
	$sFunction .= ' { return 0; }';
	usort($aArray, create_function('$a, $b', $sFunction));
} // SortAssocArrayByMultipleKeys()


HerrKlinke
Verifiziert
Beiträge: 76
Registriert: Do Sep 04, 2008 2:12 pm
Wohnort: Wismar
Kontaktdaten:

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von HerrKlinke » Do Nov 24, 2011 8:37 am

Hmm, also das Problem ist ja, das ich die Schlüsselfelder nicht kenne.

In dem Beispiel haben ja alle Arrays einen Index "Name" und einen "Alter".

Code: Alles auswählen

$aSortOptions[1]['name'] = 'Alter';
$aSortOptions[1]['sort'] = "DESC";
$aSortOptions[1]['case'] = "FALSE";
Also kann ich sagen, er soll nach Spalte 'Alter' sortieren.

Bei meinem Array kenne ich aber diese Schlüssel gar nicht.
Ich will im Prinzip sagen: sortiere nach den Schlüsselnamen der 1. Ebene. Die Werte darin interessieren gar nicht.

HerrKlinke
Verifiziert
Beiträge: 76
Registriert: Do Sep 04, 2008 2:12 pm
Wohnort: Wismar
Kontaktdaten:

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von HerrKlinke » Do Nov 24, 2011 9:02 am

Ok, ich habs mal selber versucht, weil ich nicht denke, dass es dafür keine Standardfunktion gibt.
Funktioniert perfekt.

Code: Alles auswählen

<?php
	
	$arr = array();
	
	$arr["Hallo"]["Alles"]["Klar"] = "123455";
	$arr["Hallo"]["Was"]["Geht"] = "XYZ";
	$arr["Hallo"]["Ist"]["Da Wer"] = "qwertz";
	
	$arr["Tschüß"]["Xylophon"]["Ahoi"] = "1efe55";
	$arr["Tschüß"]["Täter"]["Was denn"] = "efaef";
	$arr["Tschüß"]["Moin"]["Tach"] = "were";
	
	$arr["Aloa"]["Xylophon"]["Ahoi"] = "1efe55";
	$arr["Aloa"]["Täter"]["Was denn"] = "efaef";
	$arr["Aloa"]["Moin"]["Tach"] = "were";
	
	
	function sortArrayByFirstIndexNames($arr,$options) {
		$indexNames = array();
		$sortiert = array();
		foreach($arr as $index => $element) {
			$indexNames[] = $index;
		}
		asort($indexNames,$options);
	
		foreach($indexNames as $element) {
			$sortiert[$element] = $arr[$element];
		}
		return $sortiert;
	}
	
	
	$arr = sortArrayByFirstIndexNames($arr,SORT_ASC);		// 1. Ebene sortieren
	
	foreach($arr as &$element) {   // 2. Ebene sortieren
		$element = sortArrayByFirstIndexNames($element,SORT_ASC);
	}
	echo("<pre>");
	print_r($arr);
	echo("/<pre>");
?>
Zuletzt geändert von HerrKlinke am Do Nov 24, 2011 9:18 am, insgesamt 1-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von Xin » Do Nov 24, 2011 9:07 am

Klingt für mich nach einer Baumstruktur.

Die erste Ebene listest Du auf und sortierst danach. Jeder Punkt der Liste zweigt auf eine weitere Liste: die zweite Dimension/bzw. die Daten (bei nur einer Dimension). Die zweite Dimension kannst Du nun ebenso sortieren. Die Listen sollten entsprechend kurz sein, weil die Listen der zweiten Dimension ja schon von der ersten abhängig sind.
Auch hier wird auf eine Liste verwiesen, die die Dritte Dimension sortiert, bzw. es kommen die Daten.

Nachdem Du alles einsortiert hast, lässt Du alle Listen sortieren und kannst sie dann per L-R rekursiv auslesen und in eine sortierte Liste überführen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

HerrKlinke
Verifiziert
Beiträge: 76
Registriert: Do Sep 04, 2008 2:12 pm
Wohnort: Wismar
Kontaktdaten:

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von HerrKlinke » Do Nov 24, 2011 9:20 am

Xin hat geschrieben:Klingt für mich nach einer Baumstruktur.
Genau.
Xin hat geschrieben: Die erste Ebene listest Du auf und sortierst danach. Jeder Punkt der Liste zweigt auf eine weitere Liste: die zweite Dimension/bzw. die Daten (bei nur einer Dimension). Die zweite Dimension kannst Du nun ebenso sortieren. Die Listen sollten entsprechend kurz sein, weil die Listen der zweiten Dimension ja schon von der ersten abhängig sind.
Auch hier wird auf eine Liste verwiesen, die die Dritte Dimension sortiert, bzw. es kommen die Daten.

Nachdem Du alles einsortiert hast, lässt Du alle Listen sortieren und kannst sie dann per L-R rekursiv auslesen und in eine sortierte Liste überführen.
Hmm so ähnlich habe ich mir das auch überlegt.

Dominik
Beiträge: 381
Registriert: Mo Jul 07, 2008 9:39 pm

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von Dominik » Fr Nov 25, 2011 10:16 pm

Dann mach dir ne Funktion die so sortiert wie du möchtest und wende auf dein array zb "array_walk_recursive" an
Rechtschreibefehler sind gewollt und dienen der Unterhaltung

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von cloidnerux » Fr Nov 25, 2011 10:29 pm

Schau dir im Wiki die Sortierfunktionen an und implementiere dir deine Funktionalität selbst
Redundanz macht wiederholen unnötig.
quod erat expectandum

Dominik
Beiträge: 381
Registriert: Mo Jul 07, 2008 9:39 pm

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von Dominik » Fr Nov 25, 2011 10:43 pm

Aber was du suchst nennt sich "ksort"

http://www.php.net/manual/de/function.ksort.php

Rekursiver ansatz steht auch drunter
Rechtschreibefehler sind gewollt und dienen der Unterhaltung

flip90
Beiträge: 1
Registriert: Do Sep 08, 2011 10:14 am

Re: PHP assoziatives Array sortieren (nach Index)

Beitrag von flip90 » Fr Nov 25, 2011 11:03 pm

echo $begruessung;


jetzt war ich leider zu langsam :)

ja, ksort() ist was du suchst.




echo $verabschiedung;

Antworten