2016-07-14 19 views
0

Ich bin auf der Suche nach einer Möglichkeit, ein Array assoziativ um einen bestimmten Wert zu bestellen, ich bin mir nicht sicher, ob es möglich ist. Ich versuchte es mit array_multisort() und usort() Funktionen, aber ich habe Angst, dass ich es nicht bekommen kann.PHP - Order Array assoziative durch spezifischen Wert

Beispiel:

$array[] = array('id' => 74215, 'type' => 'BOX'); 
$array[] = array('id' => 76123, 'type' => 'UNT'); 
$array[] = array('id' => 71231, 'type' => ''); 
$array[] = array('id' => 79765, 'type' => 'UNT'); 
$array[] = array('id' => 77421, 'type' => 'BOX'); 

Wenn ich von 'BOX' bestellen möchten, dann wird das Array sein:

Array (
    [0] => Array 
     (
        [id] => 77421 
        [type] => 'BOX' 
     ) 
    [1] => Array 
     (
        [id] => 74215 
        [type] => 'BOX' 
     ) 
    [2] => Array 
     (
        [id] => 76123 
        [type] => 'UNT' 
     ) 
    . 
    . 
    . 

ich andere Zeichenfolge wie 'UNT' passieren könnte, und bestellen so. Ist das möglich ??

+0

zeigen, was Sie versucht haben. –

+0

_ "Wenn ich mit 'BOX' bestellen will" _ ist das nicht sehr logisch. Meinst du, dass du nach 'type' bestellen willst? – FirstOne

+0

Einige Referenzen: [Wie kann ich Arrays und Daten in PHP sortieren?] (Http://stackoverflow.com/questions/17364127/how-can-i-sort-arrays-and-data-in-php) ** && ** [PHP Array nach SubArray-Wert sortieren] (http://StackOverflow.com/Questions/2477496/php-sort-array-by-Subarray-Value) – FirstOne

Antwort

1

Ich nehme an, dass Sie nach String-Übereinstimmung "sortieren" möchten, zuerst alle diejenigen, die diese Zeichenfolge übereinstimmen, danach alle diejenigen, die nicht übereinstimmen. Sofern Sie eine archaische PHP-Version haben, könnte dies funktionieren:

$sortvalue = 'BOX'; 
usort($array, function($a, $b) use ($sortvalue) { 
     if($a['type'] == $sortvalue) return -1; 
     elseif($b['type'] == $sortvalue) return 1; 
     else return 0; 
    }); 

sollte dies setzen jede ‚BOX‘ Eintritt in die Vorderseite des Arrays.

Wenn alle anderen gruppiert werden sollen, statt return 0 do return $a['type'] < $b['type'].

edit: integriert Kamal pal Vorschlag/Korrektur

+1

'$ sortvalue' ist in der anonymen Funktion nicht zugänglich, du musst closure ..' function ($ a, $ b) use ($ sortvalue) ... '.. siehe auch http://stackoverflow.com/questions/18616214/confusion-with-php-closures –

+0

Das funktioniert perfekt !!! Vielen Dank @Jakumi – bey23

+0

@ kamal-pal: wird meine Antwort anpassen. Vielen Dank. – Jakumi

0

Ich bin mir nicht sicher, ob PHP hat seine eigene Funktion ist, die das tut, aber ich schreibe meine eigenen, hoffe, es hilft:

function sortArray($array_x, $key) 
{ 
    $added_indexes; 
    $new_array; 

    for($i=0;$i<count($array_x);$i++) 
    { 
     if($array_x[$i]['type']==$key){ 
      $new_array[]=$array_x[$i]; 
      $added_indexes[]=$i; 
     } 
    } 

    for($i=0;$i<count($array_x);$i++) 
    { 
     if(!in_array($i,$added_indexes)) 
     { 
      $new_array[]=$array_x[$i]; 
     } 
    } 

    return $new_array; 
} 

Also, wenn Sie tun dies:

$array[] = array('id' => 74215, 'type' => 'BOX'); 
$array[] = array('id' => 76123, 'type' => 'UNT'); 
$array[] = array('id' => 71231, 'type' => ''); 
$array[] = array('id' => 79765, 'type' => 'UNT'); 
$array[] = array('id' => 77421, 'type' => 'BOX'); 

print_r(sortArray($array,"BOX")); 

Gibt das:

Array 
(
    [0] => Array 
     (
      [id] => 74215 
      [type] => BOX 
     ) 

    [1] => Array 
     (
      [id] => 77421 
      [type] => BOX 
     ) 

    [2] => Array 
     (
      [id] => 76123 
      [type] => UNT 
     ) 

    [3] => Array 
     (
      [id] => 71231 
      [type] => 
     ) 

    [4] => Array 
     (
      [id] => 79765 
      [type] => UNT 
     ) 
) 
0

Ja, ich war in einer ähnlichen Lösung zu denken:

usort($array, function ($a, $b) { 
    return $a['type'] == 'BOX' ? -1 : ($b['type'] == 'BOX' ? 1 : 0); 
}); 
Verwandte Themen