2016-05-25 21 views
1

ich die folgende Funktion bin mit einem Array zu sortierenPHP - Funktion Sortierung Sortierung nicht indicies

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; 
} 

$prevnext = array_sort($prevnext, 'distance-between', SORT_ASC); 

Wenn ich var_dump(); die sortierten Array ($ prevnext), erhalte ich das erwartete Ergebnis, aber wenn ich var_dump($prevnext[0]);, es gibt mir nicht was ich will, sondern die Daten, bevor es sortiert wurde.

Habe ich die Sortierung falsch verstanden? Gibt es eine Möglichkeit, ein Array basierend auf einem bestimmten Wert des Schlüssels neu zu ordnen. Also, wenn ich $prevnext[0] benutze, bekomme ich Daten neu geordnet. Jede Hilfe wäre willkommen.

var_dump($prevnext); gibt unter Array, das den Abstand dazwischen Schlüssel sortiert verwendet:

array(11) { [10]=> array(7) { [0]=> string(3) "284" ["c_service_id"]=> string(3) "284" [1]=> string(14) "McGill Buckley" ["service_name"]=> string(14) "McGill Buckley" [2]=> string(7) "K2B 6V2" ["service_zip"]=> string(7) "K2B 6V2" ["distance-between"]=> float(9.24) } [0]=> array(7) { [0]=> string(4) "1319" ["c_service_id"]=> string(4) "1319" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) } [6]=> array(7) { [0]=> string(4) "1270" ["c_service_id"]=> string(4) "1270" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) } [7]=> array(7) { [0]=> string(4) "1268" ["c_service_id"]=> string(4) "1268" [1]=> string(31) "Evoke Direct Response Solutions" ["service_name"]=> string(31) "Evoke Direct Response Solutions" [2]=> string(7) "K2M 1X5" ["service_zip"]=> string(7) "K2M 1X5" ["distance-between"]=> float(13.48) } [3]=> array(7) { [0]=> string(4) "1293" ["c_service_id"]=> string(4) "1293" [1]=> string(24) "Creative Signs & Designs" ["service_name"]=> string(24) "Creative Signs & Designs" [2]=> string(7) "K1Z 7S8" ["service_zip"]=> string(7) "K1Z 7S8" ["distance-between"]=> float(27.43) } [9]=> array(7) { [0]=> string(3) "289" ["c_service_id"]=> string(3) "289" [1]=> string(8) "seoplus+" ["service_name"]=> string(8) "seoplus+" [2]=> string(7) "K2B 1A5" ["service_zip"]=> string(7) "K2B 1A5" ["distance-between"]=> float(32.32) } [5]=> array(7) { [0]=> string(4) "1275" ["c_service_id"]=> string(4) "1275" [1]=> string(35) "Innovacom Marketing & Communication" ["service_name"]=> string(35) "Innovacom Marketing & Communication" [2]=> string(7) "K1M 1L5" ["service_zip"]=> string(7) "K1M 1L5" ["distance-between"]=> float(43.62) } [8]=> array(7) { [0]=> string(4) "1267" ["c_service_id"]=> string(4) "1267" [1]=> string(27) "Rideau Mailing Services Inc" ["service_name"]=> string(27) "Rideau Mailing Services Inc" [2]=> string(7) "K2E 7K1" ["service_zip"]=> string(7) "K2E 7K1" ["distance-between"]=> float(45.74) } [2]=> array(7) { [0]=> string(4) "1294" ["c_service_id"]=> string(4) "1294" [1]=> string(21) "Agent Signs & Designs" ["service_name"]=> string(21) "Agent Signs & Designs" [2]=> string(7) "K1Y 0T8" ["service_zip"]=> string(7) "K1Y 0T8" ["distance-between"]=> float(50.11) } [1]=> array(7) { [0]=> string(4) "1297" ["c_service_id"]=> string(4) "1297" [1]=> string(21) "Golden Triangle Signs" ["service_name"]=> string(21) "Golden Triangle Signs" [2]=> string(7) "K0A 1B0" ["service_zip"]=> string(7) "K0A 1B0" ["distance-between"]=> float(57.39) } [4]=> array(7) { [0]=> string(4) "1280" ["c_service_id"]=> string(4) "1280" [1]=> string(32) "Aditek Design Printing And Signs" ["service_name"]=> string(32) "Aditek Design Printing And Signs" [2]=> string(7) "K1G 3W3" ["service_zip"]=> string(7) "K1G 3W3" ["distance-between"]=> float(64.13) } } 

aber wenn ich $prevnext[0] verwenden, wird es mir nicht um das gleiche Ergebnis wie oben. Ich bekomme:

array(7) { [0]=> string(4) "1319" ["c_service_id"]=> string(4) "1319" [1]=> string(38) "MDS MacFarlane Data & Mailing Services" ["service_name"]=> string(38) "MDS MacFarlane Data & Mailing Services" [2]=> string(7) "K1B 3V9" ["service_zip"]=> string(7) "K1B 3V9" ["distance-between"]=> float(11.66) } 

, wo ich immer sein sollte:

oben
array(7) { [0]=> string(3) "284" ["c_service_id"]=> string(3) "284" [1]=> string(14) "McGill Buckley" ["service_name"]=> string(14) "McGill Buckley" [2]=> string(7) "K2B 6V2" ["service_zip"]=> string(7) "K2B 6V2" ["distance-between"]=> float(9.24) } 

Das Array sollte, wenn var_dump($prevnext[0]); zuerst angezeigt werden, da es den niedrigsten Abstand dazwischen hat.

+0

Sie verwenden 'asort' sind sicher, dass Sie das ist die Art, die Sie brauchen? Überprüfen Sie http://php.net/manual/en/array.sorting.php – apokryfos

Antwort

0

folgendes Array-Indizes sortieren

function sort_by_order ($a, $b) 
{ 
    return $a['order'] - $b['order']; 
} 

usort($array, 'sort_by_order ');