Multidimensionales Array sortieren

error_on

Mitglied
Ich hab mal wieder ein Array-Problem :(

Folgendes Array:
Code:
Array
(
	[Tiere] => Array
	(
		[0] => Array
			(
				[rasse] => Pferd
				[platz] => 1
				[sichtung] => 3357
			)

		[1] => Array
			(
				[rasse] => Katze
				[platz] => 2
				[sichtung] => 3232
			)

		[2] => Array
			(
				[rasse] => Hund
				[platz] => 3
				[sichtung] => 525
			)

		[3] => Array
			(
				[rasse] => Vogel
				[platz] => 4
				[sichtung] => 9312
			)
	)
)

Standard bekomme ich den Array nach "Platz" sortiert (wie hier). Ich würde ihn jetzt aber gerne z.b. nach Sichtung oder nach Rasse sortieren, wie mach ich das denn genau?
Ich bin jetzt schon mit usort dran, aber irgendwie scheint meine cmp-funktion nicht so zu wollen wie ich.

PHP:
// $so ist ein array, die Elemente sind (hier in dem Fall) 0 => 'rasse', 1 => 'sichtung'
// $id kommt aus der URL

	function _cmp($a, $b) {
		return $a[$so[$id]] < $b[$so[$id]];
	}
	usort($data['Tiere'], "_cmp");
 
Bekommste da nicht iwas wie undefined variable? $id dürfte im function-scope nicht verfügbar sein....
 
array_multisort() würde dir weiterhelfen

Oder du machst dir das Leben einfach und verwendest die Funktion array_sort_by_subarray_item() welche ich vor geraumer Zeit Programmiert habe.
PHP:
print_r("Tiere sortieren nach rasse:\n");
array_sort_by_subarray_item($array['Tiere'], 'rasse');
print_r($array);

print_r("Tiere sortieren nach Platz:\n");
array_sort_by_subarray_item($array['Tiere'], 'platz');
print_r($array);

print_r("Sortierung nach Sichtung. Am Meisten Sichtungen zueoberst:\n");
array_sort_by_subarray_item($array['Tiere'], 'sichtung', SORT_DESC, SORT_NUMERIC);
print_r($array);


/**
 * mpl      by ERB software
 * http://wiki.yaslaw.info/wikka/PhpArraySortBySubarrayItem
 * @author  stefan.erb(at)erb-software.com
 * @since   PHP 5.2
 * Sortiert einen 2-Dimensionalen Array nach einem Key in der 2ten Dimension
 * @param $array        Array der sortiert wird
 * @param $key          Key im Array der sortiert werden soll (key oder index)
 * @param $direction    Sortierrichtung. SORT_ASC oder SORT_DESC
 * @param $sort_flags   SORT_REGULAR, SORT_STRING, SORT_NUMERIC. Siehe sort_flags-Parameter von sort()
 */
function array_sort_by_subarray_item(&$array, $key, $direction = SORT_ASC, $sort_flags = SORT_REGULAR){
	$sort = array();
	foreach($array as $index => $item){
		$sort[$index] = strtoupper($item[$key]);
	}
	return array_multisort($sort, $direction, $sort_flags, $array);
}

ergibt
Code:
Tiere sortieren nach rasse:
Array
(
    [Tiere] => Array
        (
            [0] => Array
                (
                    [rasse] => Hund
                    [platz] => 3
                    [sichtung] => 525
                )

            [1] => Array
                (
                    [rasse] => Katze
                    [platz] => 2
                    [sichtung] => 3232
                )

            [2] => Array
                (
                    [rasse] => Pferd
                    [platz] => 1
                    [sichtung] => 3357
                )

            [3] => Array
                (
                    [rasse] => Vogel
                    [platz] => 4
                    [sichtung] => 9312
                )

        )

)
Tiere sortieren nach Platz:
Array
(
    [Tiere] => Array
        (
            [0] => Array
                (
                    [rasse] => Pferd
                    [platz] => 1
                    [sichtung] => 3357
                )

            [1] => Array
                (
                    [rasse] => Katze
                    [platz] => 2
                    [sichtung] => 3232
                )

            [2] => Array
                (
                    [rasse] => Hund
                    [platz] => 3
                    [sichtung] => 525
                )

            [3] => Array
                (
                    [rasse] => Vogel
                    [platz] => 4
                    [sichtung] => 9312
                )

        )

)
Sortierung nach Sichtung. Am Meisten Sichtungen zueoberst:
Array
(
    [Tiere] => Array
        (
            [0] => Array
                (
                    [rasse] => Vogel
                    [platz] => 4
                    [sichtung] => 9312
                )

            [1] => Array
                (
                    [rasse] => Pferd
                    [platz] => 1
                    [sichtung] => 3357
                )

            [2] => Array
                (
                    [rasse] => Katze
                    [platz] => 2
                    [sichtung] => 3232
                )

            [3] => Array
                (
                    [rasse] => Hund
                    [platz] => 3
                    [sichtung] => 525
                )

        )

)
 
Müsste es nicht so gehen?
PHP:
$term = 'sichtung';

usort($data['Tiere'], function ($a, $b) use ($term) {
  if ($a[$term] === $b[$term]) {
    return 0;
  } else {
    return ($a[$term] < $b[$term]) ? -1 : 1;
  }
});
 
Zurück