2016-04-12 11 views
7

Ho il seguente array:l'ordinamento personalizzato array di oggetti 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 
    ] 
]; 

E voglio risolvere la cosa in modo che assomiglia a questo:

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

Quindi, in pratica ho bisogno di ordinare da product_id e user_id in modo tale da selezionare il numero più basso product_id da ciascun utente prima di passare al successivo.

Ho provato a utilizzare usort ma non ho potuto farlo funzionare.

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

Ho anche provato array_multisort ma tutto quello che potevo arrivare a fare è quello di ordinare usando lo stesso ordine che ho già recuperare dal database.

+0

il codice con 'usort' è corretto; dovresti confrontare con '<'/'>' dal primo campo, e solo se i primi campi sono uguali a confronto per secondo. –

+2

Stai dicendo che stai recuperando dal database, qualsiasi motivo per cui non stai ordinando direttamente sulla query? – Salketer

risposta

3

Assunta è i valori sono interi:

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

Inoltre è possibile utilizzare ordinazione database con ORDER BY product_id, user_id clausola.

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

uscita

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 
     ) 

) 

È inoltre possibile controllare in editor di linea. Click Here

+0

L'output non è lo stesso di quello previsto dall'OP. Anche il tuo commento sul controllo della tua risposta è completo e inutile. – Rizier123

+0

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni! – Rizier123

+0

Si prega di controllare il mio codice modificato. Ho appena dimenticato di rincorrere $ userArray e $ productArray in multisort. Ho modificato il codice e l'output anche controllato sotto l'editor collegato. Non sono brillante ed esperto come te, ma sto facendo del mio meglio per dare una risposta utile all'utente. @ Rizier123 – RJParikh

2

soluzione usando array_multisort funzione con "array di colonne" (pochi dimensioni ordinamento):

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

L'output:

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 
     ) 

)