2013-04-30 12 views
20

Ich versuche, meine PHP-Hashtable basierend auf einem bestimmten Schlüssel zu sortieren. Die Datenstruktur sieht wie folgt aus:PHP mehrdimensionales Array basierend auf Schlüssel sortieren?

print_r($mydata); 

Array(
[0] => Array 
    (
     [type] => suite 
     [name] => A-Name 
    ) 
[1] => Array 
    (
     [type] => suite 
     [name] => C-Name 
    ) 
[2] => Array 
    (
     [type] => suite 
     [name] => B-Name 
    ) 
) 

I ksort, versucht haben Art, usort aber nichts scheint zu funktionieren. Ich versuche, basierend auf dem Namen Schlüssel zwei Ebenen nach unten zu sortieren.

Dies wurde mit meinem Versuch usort:

function cmp($a, $b) { 
    return $b['name'] - $a['name']; 
} 

usort($mydata, "cmp"); 

Gibt es eine einfache Möglichkeit, dies zu tun oder muss ich Funktion eine benutzerdefinierte Sortierung schreiben?

+0

so wie hast du usort versuchen? –

+0

Ich habe meinen Code in der Frage hinzugefügt. – user1216398

+0

Subtrahieren einer Zeichenfolge von einer Zeichenfolge?!? Kein Wunder, dass es nicht funktioniert hat, hast du dir die Beispiele auf der phpdocs-Webseite angesehen? http://www.php.net/manual/en/function.usort.php - speziell Beispiel # 2 –

Antwort

49

Denken, nützlich und praktische http://php.net/manual/en/function.sort.php

function array_sort($array, $on, $order=SORT_ASC){ 

    $new_array = array(); 
    $sortable_array = array(); 

    if (count($array) > 0) { 
     foreach ($array as $k => $v) { 
      if (is_array($v)) { 
       foreach ($v as $k2 => $v2) { 
        if ($k2 == $on) { 
         $sortable_array[$k] = $v2; 
        } 
       } 
      } else { 
       $sortable_array[$k] = $v; 
      } 
     } 

     switch ($order) { 
      case SORT_ASC: 
       asort($sortable_array); 
       break; 
      case SORT_DESC: 
       arsort($sortable_array); 
       break; 
     } 

     foreach ($sortable_array as $k => $v) { 
      $new_array[$k] = $array[$k]; 
     } 
    } 

    return $new_array; 
} 

So verwenden

$list = array(
    array('type' => 'suite', 'name'=>'A-Name'), 
    array('type' => 'suite', 'name'=>'C-Name'), 
    array('type' => 'suite', 'name'=>'B-Name') 
); 

$list = array_sort($list, 'name', SORT_ASC); 

array(3) { [0]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "A-Name" } [2]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "B-Name" } [1]=> array(2) { ["type"]=> string(5) "suite" ["name"]=> string(6) "C-Name" } } 
+1

Das ist eine unglaublich komplizierte Lösung. – deceze

+0

@deceze Hallo! Danke für den Kommentar und den Downvote. Könntest du deine Meinung beweisen? Danke im Voraus. – voodoo417

+0

'usort ($ mydata, Funktion ($ a, $ b) {return strcmp ($ a ['Name'], $ b ['Name']);})' - vorausgesetzt, das funktioniert völlig in Ordnung, ja, ich würde sagen, dein ist zu kompliziert. – deceze

1

array_multisort() - Sortierung mehr oder multidimensionale Arrays

+0

das ist freundlicher als PHP Handbuch: http://www.youtube.com/watch?v=zBaHBmZLDxY – Kamil

5

diese usort Funktion versuchen:

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

$my_array = array(
0 => array 
    (
     'type' => 'suite' 
     ,'name' => 'A-Name' 
    ) 
,1 => array 
    (
     'type' => 'suite' 
     ,'name' => 'C-Name' 
    ) 
,2 => array 
    (
     'type' => 'suite' 
     ,'name' => 'B-Name' 
    ) 
); 


usort($my_array, "cmp"); 

Wenn Sie es in einer Klasse, die zweite Parameteränderungen auf ein Array wie folgt aus:

usort($my_array, array($this,'cmp')); 
1
<?php 
$a=array(
array('a'=>5,'b'=>7),array('c'=>4,'d'=>2),array('e'=>0,'f'=>12) 

    ); 
function cmp_sort($x,$y){   //your function to compare two keys 
if($x===$y) 
    return 0; 
else 
    return ($x<$y?1:-1); 
} 

uasort($a,'cmp_sort'); //call user-defined compare function 
print_r($a);    //printing the sorted array 


?> 

Output =>

Array ([2] => Array ([e] => 0 [f] => 12) [1] => Feld ([c] => 4 [d] => 2) [0] => Feld ([a] => 5 [b] = > 7))

0
$this->aasort($array,"key"); 

function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 

    foreach ($array as $ii => $va) { 
     $sorter[]=$va[$key]; 
    } 

    arsort($sorter); 

    foreach ($sorter as $ii => $va) { 
     $ret[]=$array[$ii]; 
    } 

    return $array=$ret; 
} 
0

versuchen, diesen rekursiven Modus, dass ich in Magento REST-API verwendet:

$parameters = ['searchCriteria' => ['currentPage' => 1, 'pageSize' => 20]]; 
$parameters['searchCriteria']['filter_groups'][0]['filters'][0] = ['condition_type' => 'from', 'field' => 'updated_at', 'value' => '2017-01-01T00:00:00']; 
$parameters['searchCriteria']['filter_groups'][1]['filters'][0] = ['condition_type' => 'to', 'field' => 'updated_at', 'value' => '2017-12-31T23:59:59']; 

function sortArrayByKeyAsc($_params){ 
    if(is_array($_params)){ 
     uksort($_params, 'strnatcmp'); 
     foreach ($_params as $key => $value){ 
      if(is_array($value)){ 
       $_params[$key] = sortArrayByKeyAsc($value); 
      } 
     } 
    } 
    return $_params; 
} 
Verwandte Themen