Raketenwissenschaftler: Multidimensionales Array sortieren: Neues Array

Beitrag lesen

Der Trick bei usort und Kolleginnen ist, dass man einer selbst geschriebenen Vergleichsfunktion zwei Parameter mitgibt.

Die Vergleichsfunktion vergleicht beide:

Ist der erste (in den Beispielen $a) kleiner als wie zweite, so gubt diese Funktion -1 zurück: usort tut dann nichts.

Ist der erste (in den Beispielen $a) genau so groß als der zweite, so gibt diese Funktion "0" zurück. usort tut dann nichts.

Ist der erste (in den Beispielen $a) größer als der zweite, so gibt diese Funktion "1" zurück. Usort tauscht dann um.

Auf einer ganzen Reihe solcher Vergleichs- und Umtauschaktionen basieren alle Sortieralgorythmen.

Meine Vergleichsfunktion für usort macht im Prinzip genau das, was Rolf geschrieben hat: Wenn sich das datum nicht unterscheidet wird nach UID sortiert. Unterscheidet sich auch die nicht, dann nach Prio, dto nach Prio2.

Ich habe noch eine Hilfsfunktion geschrieben, welche anders die in den Beispielen im Handbuch wenigstens sowohl Strings als auch Zahlenwerte verträgt und mit dem dritten Parameter $invers eine andere Sortierreihenfolge ermöglicht (es werden dann einfach $a und $b vertauscht...)

<?php
$arr[0]['UID'] = '5ea6c609473ab';
$arr[0]['Status'] = 'RW';
$arr[0]['Prio'] = 1;
$arr[0]['Prio2'] = 1;
$arr[0]['Datum'] = '2020-06-02';
$arr[0]['Menge'] = 1.00;
$arr[0]['Textpos'] = NULL;
$arr[0]['Bezeichnung'] = NULL;
$arr[0]['Einzelpreis'] = 15.00;
$arr[0]['Gesamtpreis'] = 15.00;


$arr[1]['UID'] = '5ea6c60947793';
$arr[1]['Status'] = 'RW';
$arr[1]['Prio'] = 1;
$arr[1]['Prio2'] = 1;
$arr[1]['Datum'] = '2020-04-02';
$arr[1]['Menge'] = 1.00;
$arr[1]['Textpos'] = NULL;
$arr[1]['Bezeichnung'] = NULL;
$arr[1]['Einzelpreis'] = 0.00;
$arr[1]['Gesamtpreis'] = NULL;


$arr[3]['UID'] = '5ea6c60947793';
$arr[3]['Status'] = 'F';
$arr[3]['Prio'] = 1;
$arr[3]['Prio2'] = 2;
$arr[3]['Datum'] = '2020-04-02';
$arr[3]['Menge'] = 1.00;
$arr[3]['Textpos'] = NULL;
$arr[3]['Bezeichnung'] = NULL;
$arr[3]['Einzelpreis'] = 100.00;
$arr[3]['Gesamtpreis'] = NULL;

/*
$newArr = [];
foreach ( $arr as $item ) {
   $uid = $item['UID'];
   unset( $item['UID'] );
   if ( ! isset ( $newArr[ $uid ] ) ) {
      $newArr[ $uid ] = [];
   }
   $newArr[ $uid ][] = $item;
}
*/
echo "\n================================\n";
var_export( $arr );
echo "\n================================\n";
echo "Nach Sortieren:";
echo "\n================================\n";
function myCompare ($a, $b, $invers = false ) {
	if ( $invers ) {
		$c=$a; $a=$b; $b=$c; unset( $c );
	}
	if ( is_string( $a ) and is_string( $b ) ) {
		return strcmp( $a, $b );
	} elseif ( is_numeric( $a )  and is_numeric( $b ) ) {
		if ( $a == $b ) return 0;
		if ( $a <  $b ) return -1;
		if ( $a >  $b ) return 1;
	} 
	trigger_error( 'Nicht vorgesehener Datentyp in Funktion myCompare. Erlaubt sind string und numeric', E_USER_ERROR );
}


function compare_Datum_UID_Prio_Prio2 ( $a, $b ) {
	$invers['Datum'] = false;
	$invers['UID'] = false;
	$invers['Prio'] = true;
	$invers['Prio2'] = true;
	foreach ( [ 'Datum', 'UID', 'Prio', 'Prio2' ] as $itemProp ) {
		$r = myCompare( $a[$itemProp], $b[$itemProp], $invers[$itemProp] );
		if ( 0 != $r ) {
			return $r;
		}
	}
}

usort($arr, 'compare_Datum_UID_Prio_Prio2' );

var_export( $arr );
echo "\n================================\n";

Meine Ausgaben:

================================
array (
  0 => 
  array (
    'UID' => '5ea6c609473ab',
    'Status' => 'RW',
    'Prio' => 1,
    'Prio2' => 1,
    'Datum' => '2020-06-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 15.0,
    'Gesamtpreis' => 15.0,
  ),
  1 => 
  array (
    'UID' => '5ea6c60947793',
    'Status' => 'RW',
    'Prio' => 1,
    'Prio2' => 1,
    'Datum' => '2020-04-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 0.0,
    'Gesamtpreis' => NULL,
  ),
  3 => 
  array (
    'UID' => '5ea6c60947793',
    'Status' => 'F',
    'Prio' => 1,
    'Prio2' => 2,
    'Datum' => '2020-04-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 100.0,
    'Gesamtpreis' => NULL,
  ),
)
================================
Nach Sortieren:
================================
array (
  0 => 
  array (
    'UID' => '5ea6c60947793',
    'Status' => 'F',
    'Prio' => 1,
    'Prio2' => 2,
    'Datum' => '2020-04-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 100.0,
    'Gesamtpreis' => NULL,
  ),
  1 => 
  array (
    'UID' => '5ea6c60947793',
    'Status' => 'RW',
    'Prio' => 1,
    'Prio2' => 1,
    'Datum' => '2020-04-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 0.0,
    'Gesamtpreis' => NULL,
  ),
  2 => 
  array (
    'UID' => '5ea6c609473ab',
    'Status' => 'RW',
    'Prio' => 1,
    'Prio2' => 1,
    'Datum' => '2020-06-02',
    'Menge' => 1.0,
    'Textpos' => NULL,
    'Bezeichnung' => NULL,
    'Einzelpreis' => 15.0,
    'Gesamtpreis' => 15.0,
  ),
)
================================
0 50

Multidimensionales Array sortieren

Rabeneik
  • php
  1. 0
    Tabellenkalk
    1. 0
      Rabeneik
      1. 1
        raketenhandbuchleser
  2. 0
    Raktenhandbuchleser
    1. 0
      Rabeneik
      1. 0
        Raktenhandbuchleser
        1. 0
          Rabeneik
  3. 1
    Rolf B
    1. 0
      Rabeneik
      1. 0
        Rolf B
        1. 0

          Multidimensionales Array sortieren: Neues Array

          Rabeneik
          1. 0
            Rolf B
          2. 0
            Raketenhandbuchleser
            1. 0

              Mist! (Korrektur)

              Raketenhandbuchleser
              1. 0
                Rabeneik
          3. 0
            Rolf B
            1. 0
              Raketenhandbuchleser
              1. 0
                Rabeneik
                1. 0
                  Raketenhandbuchleser
                  1. 0
                    Rabeneik
                    1. 0
                      Raketenhandbuchleser
            2. 0
              Rabeneik
              1. 0
                Rolf B
                1. 0
                  Rabeneik
                  1. 0
                    Raketenwissenschaftler
                    1. 0
                      Rabeneik
                      1. 0

                        Danke fürs Danke!

                        Raketenwissenschaftler
                        1. 0
                          Raketenwissenschaftler
                          • zur info
                    2. 0
                      😁😁
                      • humor
                    3. 1
                      dedlfix
                      1. 1
                        Rolf B
                        1. 0
                          Der Martin
                      2. 0

                        Vorschläge überprüfbar überprüft

                        Raketenwissenschaftler
                        1. 0

                          Messfehler entdeckt und korrigiert. Erneute Messung:

                          Raketenwissenschaftler
                          1. 0
                            Raketenwissenschaftler
                        2. 1
                          dedlfix
                          1. -1
                            Raketenwissenschaftler
                            1. 0
                              Rolf B
                              1. 0
                                Raketenwissenschaftler,
                                1. 1
                                  Rolf B
                                  1. 0
                                    Raketenphilosoph
                                    1. 1
                                      Julius
                                      1. 0

                                        Über CPUs „wandernder“ Prozess

                                        Raketenphilosoph
                                        1. 0
                                          Rolf B
                                          1. 2
                                            Raketenphilosoph
                                          2. 0

                                            (sich kloppende threads)

                                            Raketenspaßverteiler
                                            • humor
                            2. 0
                              Rabeneik
                              1. 0
                                Raketenwissenschaftler
  4. 0
    TS