Sortieren Sie ein mehrdimensionales assoziatives Array nach einer Spalte und behalten Sie die Schlüssel der ersten Ebene bei

Lesezeit: 4 Minuten

Benutzeravatar von acrmuui
acrmuui

Ich habe ein Array, das so aussieht:

$this->wordswithdata = [
    'team1' => [
        'points' => 10,
        'players' => [],
    ],
    'team2' => [
        'points' => 23,
        'players' => []
    ]
];

und ich möchte die Teams nach der Anzahl der Punkte sortieren, die jedes Team von der höchsten zur niedrigsten hat. Ich habe dies versucht:

function sort_by_points($a,$b)
{
    if ($a['points'] == $b['points']) return 0;
        return ($a['points'] < $b['points']) ? 1 : -1;
}

usort($this->wordswithdata, "sortbycount");

Dieser Ansatz überschreibt jedoch die Schlüssel, die die Teamnamen enthalten, und gibt Folgendes zurück:

[
    0 => [
        'points' => 23,
        'players' => []
    ],
    1 => [
        'points' => 10,
        'players' => [],
    ]
]

Gibt es eine Möglichkeit, das Array zu sortieren, ohne die Teamnamen als Array-Schlüssel zu verlieren?

Benutzeravatar von complex857
Komplex857

Verwenden Sie die uasort Funktion, die die Assoziationen Schlüssel => Wert intakt halten sollte.

(Nebenbemerkung: Sie können tun return $a['points'] - $b['points'] anstelle des ifs, bzw. ab php7 das Raumschiff <=> Operatordanke mbomb007 für das Update)

  • Ab PHP 7 können Sie den Spaceship-Operator verwenden <=> statt abzuziehen. Siehe die Antwort auf diese verwandte Frage

    – mbomb007

    13. März um 18:52 Uhr

Benutzeravatar von Shoe
Schuh

Sie können verwenden uasort:

uasort($array, function($a, $b) {
    return $a['points'] - $b['points'];
});

Diese Funktion sortiert ein Array so, dass Array-Indizes ihre Korrelation beibehalten mit den Array-Elementen, denen sie zugeordnet sind, mithilfe einer benutzerdefinierten Vergleichsfunktion.

U kann ein assoziatives Array wie folgt nach seinem Wert sortieren

$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");

function Ascending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a < $b) ? -1 : 1; 
}  

function Descending($a, $b) {   
    if ($a == $b) {        
        return 0;
    }   
        return ($a > $b) ? -1 : 1; 
}  


echo "Ascending order" ;
uasort($age,"Ascending");
print_r($age);


echo "</br>Descending order" ;
uasort($age,"Descending");
print_r($age);

Probieren Sie diesen Code aus, hoffen Sie, dass er funktioniert.

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"points");

its working fine i giving example
that array need sort
$sumarray=array [▼
  484 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
  493 => 54.7875
]

$original=$sumarray;

 $svalue=array_values($sumarray);
  rsort($svalue);
  $sorted=array();
  foreach ($svalue as $key => $value) {
   $kk=array_search($value,$sumarray);
  $sorted[$kk]=$value;
  unset($sumarray[$kk]);

    }
  print_r($original);
    print_r($svalue);
  print_r($sorted);
             //out put
  array:5 [▼
  484 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
  493 => 54.7875
]
array:5 [▼
  0 => 54.7875
  1 => 54.7875
  2 => 53.5375
  3 => 52.9125
  4 => 52.2875
]
array:5 [▼
  484 => 54.7875
  493 => 54.7875
  486 => 53.5375
  487 => 52.9125
  488 => 52.2875
]

  • Vielen Dank für dieses Code-Snippet, das möglicherweise eine begrenzte, sofortige Hilfe bietet. A richtige Erklärung würde seinen langfristigen Wert erheblich verbessern, indem es aufzeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen würde. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.

    – Steinbock

    30. Juli 2018 um 8:54 Uhr

  • Ich kann mir kein mögliches Szenario vorstellen, in dem ich diese Art von indirektem/verschachteltem Code in mein Projekt einladen möchte. Abgesehen von der Tatsache, dass diese Antwort dieselbe Datenstruktur ignorierte, warum sollte jemand mit einem flachen assoziativen Array anrufen? array_values()Dann rsort()und führen Sie dann iterierte Aufrufe von durch array_search() Und unset()???

    – mickmackusa

    15. März um 21:04 Uhr

Benutzeravatar von mickmackusa
mickmackusa

Der Vollständigkeit halber sollte diese Seite einen Ansatz mit enthalten array_multisort() — diese Funktion behält standardmäßig nicht-numerische Tasten bei.

Code: (Demo)

array_multisort(
    array_column($array, 'points'),
    SORT_DESC,
    $array
);

Das heißt, es ist nichts falsch daran, anzurufen uasort() mit dem Raumschiffbetreiber. Beachten Sie, dass $b Daten befinden sich auf der linken Seite des Dreiwege-Vergleichsoperators und $a befindet sich auf der rechten Seite, um eine absteigende Sortierung zu erreichen.

Code: Demo

uasort(
    $array,
    fn($a, $b) => $b['points'] <=> $a['points']
);

  • Vielen Dank für dieses Code-Snippet, das möglicherweise eine begrenzte, sofortige Hilfe bietet. A richtige Erklärung würde seinen langfristigen Wert erheblich verbessern, indem es aufzeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen würde. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.

    – Steinbock

    30. Juli 2018 um 8:54 Uhr

  • Ich kann mir kein mögliches Szenario vorstellen, in dem ich diese Art von indirektem/verschachteltem Code in mein Projekt einladen möchte. Abgesehen von der Tatsache, dass diese Antwort dieselbe Datenstruktur ignorierte, warum sollte jemand mit einem flachen assoziativen Array anrufen? array_values()Dann rsort()und führen Sie dann iterierte Aufrufe von durch array_search() Und unset()???

    – mickmackusa

    15. März um 21:04 Uhr

1449170cookie-checkSortieren Sie ein mehrdimensionales assoziatives Array nach einer Spalte und behalten Sie die Schlüssel der ersten Ebene bei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy