2016-04-12 19 views
7

Ich habe folgende Array:Benutzerdefinierte Sortierung Array von Objekten in PHP

$arr = [ 
    [ 
     'user_id' => 1, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 3 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 3, 
     'product_id' => 1 
    ] 
]; 

Und ich will es sortieren, so dass es wie folgt aussieht:

$arr = [ 
    [ 
     'user_id' => 1, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 3, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 3 
    ] 
]; 

ich von product_id Also im Grunde bestellen müssen und user_id in der Weise, dass es die niedrigere Nummer product_id von jedem Benutzer auswählt, bevor mit dem nächsten fortgefahren wird.

Ich habe versucht, usort zu verwenden, aber ich konnte es nicht zum Funktionieren bringen.

usort($campaigns, function($a, $b){ 
    if($a['product_id'] == $b['product_id']){ 
     return 0; 
    } 

    if($a['product_id'] < $b['product_id']){ 

     if($a['user_id'] == $b['user_id']){ 
      return 1; 
     } 

     if($a['user_id'] < $a['user_id']){ 
      return 0; 
     } 

     return -1; 
    }else{ 

     if($a['user_id'] == $a['user_id']){ 
      return -1; 
     } 

     if($a['user_id'] < $a['user_id']){ 
      return 0; 
     } 

     return 1; 
    } 
}); 

Ich habe auch versucht array_multisort aber alles, was ich es zu tun bekommen könnte mit der gleichen Reihenfolge zu anordnen, dass ich bereits aus der Datenbank abrufen.

+0

Code mit 'usort' ist falsch; Sie sollten mit '<'/'>' durch das erste Feld vergleichen, und nur wenn die ersten Felder gleich sind, vergleichen Sie sie mit der Sekunde. –

+2

Sie sagen, dass Sie aus der Datenbank abrufen, einen Grund, warum Sie nicht direkt in der Abfrage sortieren? – Salketer

Antwort

3

Annahme ist Ihre Werte ganze Zahlen sind:

usort($campaigns, function($a, $b){ 
    if($a['product_id'] == $b['product_id']){ 
     return $a['user_id'] - $b['user_id']; 
    } else { 
     return $a['product_id'] - $b['product_id']; 
    } 
}); 

Sie können auch Datenbank Bestellung mit ORDER BY product_id, user_id-Klausel verwenden.

1
$arrTags = [ 
    [ 
     'user_id' => 1, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 1, 
     'product_id' => 3 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 1 
    ], 
    [ 
     'user_id' => 2, 
     'product_id' => 2 
    ], 
    [ 
     'user_id' => 3, 
     'product_id' => 1 
    ] 
]; 

foreach($arrTags as $key => $row){ 
$userArray[$key] = $row['user_id']; 
$productArray[$key] = $row['product_id']; 
} 

array_multisort($productArray, SORT_ASC, $userArray, SORT_ASC, $arrTags); 
print_r($arrTags); 

Ausgabe

Array 
(
    [0] => Array 
     (
      [user_id] => 1 
      [product_id] => 1 
     ) 

    [1] => Array 
     (
      [user_id] => 2 
      [product_id] => 1 
     ) 

    [2] => Array 
     (
      [user_id] => 3 
      [product_id] => 1 
     ) 

    [3] => Array 
     (
      [user_id] => 1 
      [product_id] => 2 
     ) 

    [4] => Array 
     (
      [user_id] => 2 
      [product_id] => 2 
     ) 

    [5] => Array 
     (
      [user_id] => 1 
      [product_id] => 3 
     ) 

) 

Sie können auch im Online-Editor überprüfen. Click Here

+0

Ihre Ausgabe entspricht nicht der von OP erwarteten. Auch Ihr Kommentar über die Überprüfung Ihrer Antwort ist komplett Lärm und nutzlos. – Rizier123

+0

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies reduziert die Lesbarkeit sowohl des Codes als auch der Erklärungen! – Rizier123

+0

Bitte überprüfen Sie meinen bearbeiteten Code. Ich habe gerade vergessen, $ userArray und $ productArray in Multisort zu ändern. Ich habe den Code bearbeitet und auch den unten verlinkten Editor aktiviert. Ich bin nicht brillant und Experte wie Sie, aber ich versuche mein Bestes, um nützliche Benutzer zu geben. @ Rizier123 – RJParikh

2

Lösung array_multisort Funktion mit "array of columns" (wenige Sortiermaße):

$userIds = $productIds = []; 
foreach ($arr as $k => $v) { 
    $userIds[$k] = $v['user_id']; 
    $productIds[$k] = $v['product_id']; 
} 

array_multisort($productIds, SORT_ASC, $userIds, SORT_ASC, $arr); 

print_r($arr); 

Der Ausgang:

Array 
(
    [0] => Array 
     (
      [user_id] => 1 
      [product_id] => 1 
     ) 

    [1] => Array 
     (
      [user_id] => 2 
      [product_id] => 1 
     ) 

    [2] => Array 
     (
      [user_id] => 3 
      [product_id] => 1 
     ) 

    [3] => Array 
     (
      [user_id] => 1 
      [product_id] => 2 
     ) 

    [4] => Array 
     (
      [user_id] => 2 
      [product_id] => 2 
     ) 

    [5] => Array 
     (
      [user_id] => 1 
      [product_id] => 3 
     ) 

) 
Verwandte Themen