2013-06-27 12 views
14

OK, ho già preso questa domanda StackOverflow ma purtroppo è in javascript - Javascript - sort array based on another arrayPHP: ordina l'array in base a un altro array?

e lo voglio in PHP

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

per abbinare la disposizione di questo array:

sortingArr = array("5","4","3","2","1"); 

e l'output che sto cercando:

$data = array(
    "item3"=>"5", 
    "item5"=>"4", 
    "item2"=>"3", 
    "item4"=>"2", 
    "item1"=>"1" 
); 

Qualche idea su come si possa fare? Grazie.

+0

You co uld 'asort()' entrambi. – Albzi

+0

Usa 'usort()', con una funzione di confronto che confronta le posizioni dei valori in '$ ordinamentoArr'. – Barmar

risposta

0

Dai uno sguardo allo array_multisort. Non sono completamente sicuro di come utilizzarlo, poiché non ho mai trovato un uso pratico (preferisco usare usort per definire chiaramente i miei termini), ma potrebbe funzionare per voi.

+1

Non penso che 'array_multisort()' faccia quello di cui ha bisogno. Ordinerà normalmente un array, quindi riordina l'altro array in modo corrispondente. – Barmar

+0

Quindi se il primo array è quello che contiene l'ordine desiderato, non dovrebbe significare mettere l'array '$ data' come secondo, di conseguenza ...? Non so, come ho detto, non ho mai usato quella funzione! –

+0

Non l'ho ancora usato, ma gli esempi sulla pagina di documentazione non sembrano corrispondere a ciò che lui vuole. Guarda l'esempio n. 1. Non mantiene alcun input nel suo ordine originale. – Barmar

7

Abbastanza semplice?

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

$sortingArr = array("5","4","3","2","1"); 

$result = array(); // result array 
foreach($sortingArr as $val){ // loop 
    $result[array_search($val, $data)] = $val; // adding values 
} 
print_r($result); // print results 

uscita:

Array 
(
    [item3] => 5 
    [item5] => 4 
    [item2] => 3 
    [item4] => 2 
    [item1] => 1 
) 
+2

Non penso che questa sia una buona soluzione efficiente per la memoria. In questo caso, la funzione di usort è molto più semplice e veloce. Ma ancora questa è una soluzione funzionante per piccoli array. BR. –

+1

Finché questo non viene fatto in una parte critica dell'applicazione e i dati sono piuttosto piccoli, farà il suo lavoro in un modo facile da capire. – flu

1

Guardate il mio seguente frammento di ordinare l'array basa su un altro array:

$res_arr = array(); 
for ($i = 0; $i < count($sortingArr); $i++) { 
    for ($j = 0; $j < count($data); $j++) { 
      if($data[$j] == $sortingArr[$i]) { 
      $res_arr[] = $data[$j]; 
      break; 
      } 
    } 
} 
// $res_array is your sorted array now 
0
<?php 
$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 
$result=array_flip($data); 

krsort($result); 

$result=array_flip($result); 

print_r($result); 

//use rsort for the index array 

$sortingArr = array("5","4","3","2","1"); 

print_r($sortingArr); 
+0

Non ha davvero senso ordinare i valori di '$ data' in base ai valori. Poiché '$ sortingArr' potrebbe non essere un valore discendente. Anche usando 'array_flip' e poi' krsort' è solo brutto, puoi usare direttamente 'rsort'. – HamZa

+0

$ sortingArr anche ordinato in ordine decrescente utilizzando rsort. Entrambi gli array sono disponibili in ordine decrescente ora – Sundar

8

Per una risposta dettagliata, perché array_multisort fa non corrisponde alle tue esigenze, guarda questa risposta, per favore: PHP array_multisort not sorting my multidimensional array as expected

In breve: si desidera ordinare un array in base a un ordine predefinito. La risposta è data anche là, ma ho copiato una soluzione a questa risposta, troppo:

Usa usort e array_flip, in modo da essere in grado di trasformare l'array indicizzazione (ValueByPosition) in un PositionByValue Array.

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

usort($data, "sortByPredefinedOrder"); 

function sortByPredefinedOrder($leftItem, $rightItem){ 
    $order = array("5","4","3","2","1"); 

    $flipped = array_flip($order); 

    $leftPos = $flipped[$leftItem]; 
    $rightPos = $flipped[$rightItem]; 
    return $leftPos >= $rightPos; 
} 

print_r($data); 
// usort: Array ([0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1) 
// uasort: Array ([item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1) 

Tuttavia ciò richiederebbe di prevedere tutti gli elementi possibili all'interno dell'array di ordini predefinito o di collegare altri elementi in modo appropriato.

Se si desidera mantenere le chiavi assoc, utilizzare uasort anziché usort.

0

utilizzando usort()the right way penso

Ordina un array mediante una funzione definita dall'utente

si può fare come segue:

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

$sortingArr = array("5","4","3","2","1"); 

$keys = array_flip($sortingArr); 

usort($data, function ($a, $b) use ($keys) { 
    return $keys[$a] > $keys[$b] ? 1 : -1; 
}); 

print_r($data); 

// Output 
// Array ([0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1) 

esempio dal vivo: https://3v4l.org/75cnu

Problemi correlati