ottscho
Goto Top

Sortieren von Unterarray

Hey,

ich komme nicht ganz klar und weiß nicht wie ich mein Array nach Name sortieren kann. Bein beispiel ist jetzt leider schon korrekt sortiert, aber das Array besteht aus viel mehr Datensätzen. Das ist nur ein kleiner Auszug.
Im Prinzip sollen alle Unterarrys nach ["name"] sortiert werden. So wie hier Bridgestone, Goodyear etc.

Habt ihr mir einen Tipp? mit asort und ksort kann ich ja kein Feld mit geben.

array(71) {
  [26]=>
  array(5) {
    ["id"]=>  
    string(2) "26"  
    ["name"]=>  
    string(11) "BRIDGESTONE"  
    ["img"]=>  
    string(36) "d01381cfdbedf6b2fa3a8ca44c093327.png"  
    ["link"]=>  
    string(0) ""  
    ["count"]=>  
    string(2) "41"  
  }
  [9]=>
  array(5) {
    ["id"]=>  
    string(1) "9"  
    ["name"]=>  
    string(8) "GOODYEAR"  
    ["img"]=>  
    string(36) "05acbc947e294fda0a05680a826be36f.png"  
    ["link"]=>  
    string(0) ""  
    ["count"]=>  
    string(2) "28"  
  }
  [2]=>
  array(5) {
    ["id"]=>  
    string(1) "2"  
    ["name"]=>  
    string(7) "PIRELLI"  
    ["img"]=>  
    string(36) "7c9d8090adb1e1192f3864b694058911.png"  
    ["link"]=>  
    string(0) ""  
    ["count"]=>  
    string(2) "27"  
  }
}

Besten Dank im Voraus

Content-ID: 182388

Url: https://administrator.de/contentid/182388

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

neuni88
neuni88 21.03.2012 um 20:40:35 Uhr
Goto Top
Tag,

das solltest du mit usort recht einfach hinbekommen: http://www.php.net/manual/de/function.usort.php
Baust dir einfach eine Vergleichsfunktion wie im Beispiel von php.net, vergleichst aber nicht $a und $b direkt, sondern $a['name'] und $b['name'].
Guenni
Guenni 21.03.2012 um 20:43:11 Uhr
Goto Top
Hi ottscho,

du kannst die Funktion uasort mit einer Vergleichsfunktion verwenden.

<?php
/*
* Vergleichsfunktion 
*/
function so($a, $b){
	/*
	* @index: Enthält irgendeinen Schlüssel des/der Arrays, z.B.:
	*/
	$index='name';  
	return (strcmp ($a[$index],$b[$index]));
}
?>

Die Vergleichsfunktion wird dann zusammen mit dem Array an uasort übergeben,

die Vergleichsfunktion allerdings in Anführungszeichen ohne Klammern!!.

<?php
/*
* Sortieren
*/
uasort($arr, 'so');  
?>


Gruß
Günni

PS.: Für den Fall, dass nach Zahlen sortiert werden soll, kannst du nicht strcmp verwenden.

Dazu müsste die Vergleichsfunktion anders geschrieben werden:

<?php
function so($a, $b) {
    $index=Array-Key;
    if ($a[$index] == $b[$index]) {
        return 0;
    }
    return ($a[$index] < $b[$index]) ? -1 : 1;
}
?>

Aber strcmp ist halt kürzer ;-p
ottscho
ottscho 22.03.2012 um 07:24:59 Uhr
Goto Top
Danke euch für die super Antwoort mit direktem Lösungsweg.
Ich werde das heute abend direkt ausprobieren.

Grüße
ottscho
ottscho 22.03.2012 um 08:21:21 Uhr
Goto Top
Hi,

habe es doch schnell eben getestet. Leider klappt es nicht.
Kann es sein, dass ich eine Ebene tiefer muss?

Theoretisch befindet sich ja der Key hier:

sSuppliers['name']
sSuppliers[1]['name']
sSuppliers[2]['name']
sSuppliers[3]['name']
ottscho
ottscho 22.03.2012 um 08:58:27 Uhr
Goto Top
so habe ich es nun:
static function mysearchFuzzyAction(Enlight_Hook_HookArgs $args)

	{	

		$view = $args->getSubject()->View();

		$supplier = $view->sSearchResults['sSuppliers'];  

		var_dump($supplier);

		$supplier = uasort($supplier, 'so');  

		var_dump($supplier);

		

	}

		

	/*

	* Vergleichsfunktion 

	*/

	function so($a, $b){

		return (strcmp ($a['name'],$b['name']));  

	}

Beim ersten dump wird das Array normal ausgegeben und beim Zweiten nach der Sortierung ist NULL.


Ich habe die Fehlerquelle gefunden, aber ich kann das Porblem nicht lösen:

$supplier = $view->sSearchResults['sSuppliers'];  

$keys = array_keys($supplier);
print_r($supplier[$keys[0]]['name']);  

So gebe ich den Namen aus. Ich müsste nun die Function anpassen, dass die Sortierung funktioniert.
Guenni
Guenni 22.03.2012 um 10:25:11 Uhr
Goto Top
Hi ottscho,

das muß irgendeine andere Ursache haben. Ich poste dir mal das komplette Script

und die Ausgabe vor und nach der Sortierung. Dann siehst du, dass mein Testarray

genau wie deins aufgebaut ist und die Sortierung nach 'name' durchgeführt wird.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<head>
<title>Untitled</title>
</head>
<body>
<? 
/*
* Vergleichsfunktion 
*/
function so($a, $b){
	/*
	* @index: Enthält irgendeinen Schlüssel des/der Arrays, z.B.:
	*/
	$index='name';  
	return (strcmp ($a[$index],$b[$index]));
}

/*
* Ein Array
*/
$arr = array ( array('id' => '26','name' => 'Anna', 'datum' => '01.01.1963','sex' => 'weiblich'),  
                array('id' => '23','name' => 'Xaver', 'datum' => '03.05.1964','sex' => 'männlich'),  
                  array('id' => '22','name' => 'Jonas', 'datum' => '01.01.1961','sex' => 'männlich'),   
                  array('id' => '21','name' => 'Sabine', 'datum' => '13.09.1968','sex' => 'weiblich'));  
/*
* Ausgabe des Arrays
*/								
echo "Ausgabe:<pre>";  
var_dump($arr);
echo "</pre>";  
/*
Sortieren
*/
uasort($arr,'so');  
/*
* Ausgabe des sortierten Arrays
*/
echo "Ausgabe nach uasort:<pre>";  
var_dump($arr);
echo "</pre>";  
?>
</body>
</html>

Und hier die Ausgaben von var_dump:

Ausgabe:
array(4) {
  =>
  array(4) {
    ["id"]=>  
    string(2) "26"  
    ["name"]=>  
    string(4) "Anna"  
    ["datum"]=>  
    string(10) "01.01.1963"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [1]=>
  array(4) {
    ["id"]=>  
    string(2) "23"  
    ["name"]=>  
    string(5) "Xaver"  
    ["datum"]=>  
    string(10) "03.05.1964"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [2]=>
  array(4) {
    ["id"]=>  
    string(2) "22"  
    ["name"]=>  
    string(5) "Jonas"  
    ["datum"]=>  
    string(10) "01.01.1961"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [3]=>
  array(4) {
    ["id"]=>  
    string(2) "21"  
    ["name"]=>  
    string(6) "Sabine"  
    ["datum"]=>  
    string(10) "13.09.1968"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
}

Ausgabe nach uasort:
array(4) {
  =>
  array(4) {
    ["id"]=>  
    string(2) "26"  
    ["name"]=>  
    string(4) "Anna"  
    ["datum"]=>  
    string(10) "01.01.1963"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [2]=>
  array(4) {
    ["id"]=>  
    string(2) "22"  
    ["name"]=>  
    string(5) "Jonas"  
    ["datum"]=>  
    string(10) "01.01.1961"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [3]=>
  array(4) {
    ["id"]=>  
    string(2) "21"  
    ["name"]=>  
    string(6) "Sabine"  
    ["datum"]=>  
    string(10) "13.09.1968"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [1]=>
  array(4) {
    ["id"]=>  
    string(2) "23"  
    ["name"]=>  
    string(5) "Xaver"  
    ["datum"]=>  
    string(10) "03.05.1964"  
    ["sex"]=>  
    string(8) "männlich"  
  }
}

Gruß
Günni
ottscho
ottscho 22.03.2012 um 11:13:06 Uhr
Goto Top
Hi Günni,

dein Script funktioniert so natürlich.
Was mir aber auffällt:

array(4) {
  =>
  array(4) {
    ["id"]=>  
    string(2) "26"  
    ["name"]=>  
    string(4) "Anna"  
    ["datum"]=>  
    string(10) "01.01.1963"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [1]=>
  array(4) {
    ["id"]=>  
    string(2) "23"  
    ["name"]=>  
    string(5) "Xaver"  
    ["datum"]=>  
    string(10) "03.05.1964"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [2]=>
  array(4) {
    ["id"]=>  
    string(2) "22"  
    ["name"]=>  
    string(5) "Jonas"  
    ["datum"]=>  
    string(10) "01.01.1961"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [3]=>
  array(4) {
    ["id"]=>  
    string(2) "21"  
    ["name"]=>  
    string(6) "Sabine"  
    ["datum"]=>  
    string(10) "13.09.1968"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
}

Ausgabe nach uasort:
array(4) {
  =>
  array(4) {
    ["id"]=>  
    string(2) "26"  
    ["name"]=>  
    string(4) "Anna"  
    ["datum"]=>  
    string(10) "01.01.1963"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [2]=>
  array(4) {
    ["id"]=>  
    string(2) "22"  
    ["name"]=>  
    string(5) "Jonas"  
    ["datum"]=>  
    string(10) "01.01.1961"  
    ["sex"]=>  
    string(8) "männlich"  
  }
  [3]=>
  array(4) {
    ["id"]=>  
    string(2) "21"  
    ["name"]=>  
    string(6) "Sabine"  
    ["datum"]=>  
    string(10) "13.09.1968"  
    ["sex"]=>  
    string(8) "weiblich"  
  }
  [1]=>
  array(4) {
    ["id"]=>  
    string(2) "23"  
    ["name"]=>  
    string(5) "Xaver"  
    ["datum"]=>  
    string(10) "03.05.1964"  
    ["sex"]=>  
    string(8) "männlich"  
  }
}

Bei dir Sind die Schlüssel nach der Reihe fortlaufend 0,1,2,3

array(4) {
=>
....
....
[1]=>
[2]=>

Bei mir siehe erstes Post aber zufällig:

array(71) {
[26]=>
....
....
[9]=>
[2]=>

Evtl hängt es damit zusammen.


Danke dir für deine Mühe
ottscho
ottscho 22.03.2012 um 11:39:58 Uhr
Goto Top
Habe es gelöst.
Zwei fehler von mir.
Ich habe das Array immer wieder übersachrieben und ich muss in meiner Umgebung die Classe beim Vergleich mitgeben:

static function mysearchFuzzyAction(Enlight_Hook_HookArgs $args)

	{	

		$view = $args->getSubject()->View();

		$supplier = $view->sSearchResults['sSuppliers'];  

		uasort($supplier, array('Shopware_Plugins_Frontend_OttschoSortSupplierPlugin_Bootstrap' ,'so'));  

		var_dump($supplier);

		

	}

		

	/*

	* Vergleichsfunktion 

	*/

	function so($a, $b){

		return (strcmp ($a['name'],$b['name']));  

	}