2016-04-12 16 views
7

Mam następującą tablicę:Niestandardowe sortowanie tablicę obiektów w 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 
    ] 
]; 

I chcę je posortować więc wygląda to tak:

$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 
    ] 
]; 

Więc w zasadzie muszę zamówić przez product_id i user_id w taki sposób, aby wybrać niższy numer product_id od każdego użytkownika przed przejściem do następnego.

Próbowałem użyć usort, ale nie mogłem go uruchomić.

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

Próbowałem też array_multisort ale wszystko, co mogłem zrobić to zrobić, to zamówić używając tej samej kolejności, że już pobrać z bazy danych.

+0

kod z 'usort' jest błędne; powinieneś porównać do "<'/'>" przez pierwsze pole i tylko wtedy, gdy pierwsze pola są równe, porównaj przez sekundę. –

+2

Mówisz, że pobierasz dane z bazy danych, z dowolnego powodu, dlaczego nie sortujesz bezpośrednio w zapytaniu? – Salketer

Odpowiedz

3

założenie jest Twoje wartości są liczbami całkowitymi:

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']; 
    } 
}); 

Również można użyć uporządkowanie bazy danych z ORDER BY product_id, user_id klauzuli.

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

Wyjście

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 
     ) 

) 

Można również sprawdzić w edytorze online. Click Here

+0

Twoje dane wyjściowe nie są takie same jak oczekiwane przez OP. Również twój komentarz na temat sprawdzania odpowiedzi jest kompletny i bezużyteczny. – Rizier123

+0

Podczas gdy ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – Rizier123

+0

Proszę sprawdzić mój zredagowany kod. Po prostu zapomniałem ogłosić $ userArray i $ productArray w multisort. Edytowałem kod i dane wyjściowe również sprawdziłem pod edytorem połączonym. Nie jestem genialny i doświadczony jak ty, ale staram się jak najlepiej dać użyteczną odpowiedź użytkownikowi. @ Rizier123 – RJParikh

2

array_multisort Rozwiązanie za pomocą funkcji z "tablicy kolumn" (kilku wymiarach sortowania):

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

Wyjście:

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 
     ) 

) 
Powiązane problemy