2013-04-30 22 views
20

Sto cercando di ordinare il mio hashtable PHP basato su una chiave specifica. Il datastructure assomiglia a questo:Ordina array PHP multidimensionale basato sulla chiave?

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 
    ) 
) 

Ho provato ksort, sorta, usort ma nulla sembra funzionare. Sto cercando di ordinare sulla base del nome chiave due livelli in giù.

Questo è stato il mio tentativo usando usort:

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

usort($mydata, "cmp"); 

C'è un modo semplice per fare questo o ho bisogno di scrivere una funzione di ordinamento personalizzata?

+0

Così come ha fatto si tenta usort? –

+0

Ho aggiunto il mio codice nella domanda. – user1216398

+0

Sottrai una stringa da una stringa?!? Non c'è da stupirsi che non ha funzionato, hai guardato gli esempi sulla pagina Web di phpdocs? http://www.php.net/manual/en/function.usort.php - specificamente l'esempio # 2 –

risposta

49

pensiero, più utile e pratico 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; 
} 

Come utilizzare

$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

Che è una soluzione straordinariamente complicata. – deceze

+0

@deceze Ciao! Grazie per il commento e il downvot. Potresti provare la tua opinione? Grazie in anticipo. – voodoo417

+0

'usort ($ mydata, function ($ a, $ b) {return strcmp ($ a ['name'], $ b ['name']])} - dato che funziona perfettamente, sì, I Suppongo che il tuo sia troppo complicato. – deceze

1

array_multisort() - Ordina multipli o multidimensionali array

+0

questo è più amichevole del manuale PHP: http://www.youtube.com/watch?v=zBaHBmZLDxY – Kamil

5

Prova questa funzione usort:

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"); 

Se si utilizza in una classe, il secondo parametro modifiche a un array come questo:

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 


?> 

uscita =>

Array ([2] => Array ([e] => 0 [f] => 12) [1] => Matrice ([c] => 4 [d] => 2) [0] => Matrice ([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

provare questa modalità ricorsiva, che ho usato in Magento REST API:

$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; 
} 
Problemi correlati