Doppelte Einträge werden beim sortieren rausgenommen. Was muss ich ändern?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Doppelte Einträge werden beim sortieren rausgenommen. Was muss ich ändern?

    Hallo alle,

    ich bin kein Pro und weiß nicht wie dämlich meine Frage ist aber ich bräuchte Hilfe!
    Bei folgender Funktion wird immer nur EINER von mehreren gleichen Nachnamen gelistet und der (die) andere(n) flieg/t(en) raus.
    Ich verstehe leider nicht warum?
    Was muss ich ändern?

    function record_sort($records, $field, $reverse=false){

    $hash = array();

    foreach($records as $record){
    $hash[$record[$field]] = $record;
    }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record){
    $records []= $record;
    }
    return $records;
    }


    array[0]('id'=>1, 'lastname'=> 'Heinz', 'name'=>'Tomate')
    array[1]('id'=>2, 'lastname'=> 'Zufall', 'name'=>'Rainer')
    array[2]('id'=>3, 'lastname'=> 'Zufall', 'name'=>'Blöder')
    array[3]('id'=>4, 'lastname'=> 'Heinz', 'name'=>'Ketchup')

    record_sort(array, "lastname");

    Statt:
    array[0]('id'=>1, 'lastname'=> 'Heinz' 'name'=>'Tomate')
    array[1]('id'=>4, 'lastname'=> 'Heinz', 'name'=>'Ketchup')
    array[3]('id'=>3, 'lastname'=> 'Zufall', 'name'=>'Blöder')
    array[4]('id'=>2, 'lastname'=> 'Zufall', 'name'=>'Rainer')

    Kommt dabei raus:
    array[0]('id'=>4, 'lastname'=> 'Heinz' 'name'=>'Ketchup')
    array[1]('id'=>3, 'lastname'=> 'Zufall', 'name'=>'Blöder')


  • #2
    Da liegt der Fehler:
    PHP-Code:
    $hash[$record[$field]] = $record
    Dort wird "Heinz" und Zufall überschrieben und deshalb kommen nur die letzten beiden Einträge je Nachname raus.

    Kommentar


    • #3
      PHP-Code:
      <?php
      class array_sorter
      {
          var 
      $skey false;
          var 
      $sarray false;
          var 
      $sasc true;

          
      /**
          * Constructor
          *
          * @access public
          * @param mixed $array array to sort
          * @param string $key array key to sort by
          * @param boolean $asc sort order (ascending or descending)
          */
          
      public function __construct($array$key$asc=true)
          {
              
      $this->sarray $array;
              
      $this->skey $key;
              
      $this->sasc $asc;
          }

          
      /**
          * Sort method
          *
          * @access public
          * @param boolean $remap if true reindex the array to rewrite indexes
          */
          
      function sortit($remap=true)
          {
              
      $array = &$this->sarray;

              
      uksort($array, array($this"_as_cmp"));
              if (
      $remap)
              {
                  
      $tmp = array();
                  foreach(
      $array as $id => $data)
                      
      $tmp[] = $data;
                  return 
      $tmp;
              }
              return 
      $array;
          }

          
      /**
          * Custom sort function
          *
          * @access private
          * @param mixed $a an array entry
          * @param mixed $b an array entry
          */
          
      function _as_cmp($a$b)
          {
              
      //since uksort will pass here only indexes get real values from our array
              
      if (!is_array($a) && !is_array($b))
              {
                  
      $a $this->sarray[$a][$this->skey];
                  
      $b $this->sarray[$b][$this->skey];
              }

              
      //if string - use string comparision
              
      if (!ctype_digit($a) && !ctype_digit($b))
              {
                  if (
      $this->sasc)
                      return 
      strcasecmp($a$b);
                  else
                      return 
      strcasecmp($b$a);
              }
              else
              {
                  if (
      intval($a) == intval($b))
                      return 
      0;

                  if (
      $this->sasc)
                      return (
      intval($a) > intval($b)) ? -1;
                  else
                      return (
      intval($a) > intval($b)) ? : -1;
              }
          }

      }
      //end of class

      function multi_sort($array$key$asc=true)
      {
           
      $sorter = new array_sorter($array$key$asc);
           return 
      $sorter->sortit();
      }
          
      $data = array(array('id'=>1'lastname'=> 'Heinz''name'=>'Tomate'),
                    array(
      'id'=>2'lastname'=> 'Zufall''name'=>'Rainer'),
                    array(
      'id'=>3'lastname'=> 'Zufall''name'=>'Blöder'),
                    array(
      'id'=>4'lastname'=> 'Heinz''name'=>'Ketchup')
                   );

       
      $new_array multi_sort($data"lastname"true);
       
       echo 
      "<pre>";
       
      var_dump($new_array);
       echo 
      "</pre>";
      ?>
      Entnommen und angepasst von https://www.php.net/manual/de/function.uksort.php#47936
      Zuletzt geändert von scatello; 22.04.2026, 20:09.

      Kommentar

      Lädt...
      X