2013-06-27 17 views
14

OK, ja już mam to pytanie stackoverflow, ale niestety jest to w JavaScript - Javascript - sort array based on another arrayTablica PHP-Sort na podstawie innej tablicy?

i chcę go w PHP

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

dopasować ułożenie tej tablicy:

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

i dane wyjściowe, których szukam:

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

Każdy pomysł, jak to zrobić? Dzięki.

+0

You co uld 'asort()' oba z nich. – Albzi

+0

Użyj 'usort()', z funkcją porównania, która porównuje pozycje wartości w '$ sortingArr'. – Barmar

Odpowiedz

0

Spójrz na array_multisort. Nie jestem całkowicie pewien, jak go używać, ponieważ nigdy nie znalazłem praktycznego zastosowania (wolę używać usort, aby jasno zdefiniować moje warunki), ale to może działać dla ciebie.

+1

Nie sądzę, że 'array_multisort()' robi to, czego potrzebuje. Sortuje ona jedną tablicę normalnie, a następnie odpowiednio zmienia kolejną tablicę. – Barmar

+0

Więc jeśli pierwsza tablica jest tą, która zawiera żądaną kolejność, czy nie powinno to oznaczać umieszczenia tablicy '$ data' jako drugiej, aby odpowiednio ją posortować ...? Nie wiem, jak powiedziałem, nigdy nie użyłem tej funkcji! –

+0

Ja też tego nie używałem, ale przykłady na stronie z dokumentacją nie pasują do tego, czego chce. Spójrz na przykład nr 1. Nie zachowuje danych wejściowych w oryginalnej kolejności. – Barmar

7

Całkiem proste?

$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 

wyjściowa:

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

Nie sądzę, że jest to dobre rozwiązanie wydajne pamięci. Funkcja usortowania jest w tym przypadku znacznie łatwiejsza i szybsza. Ale wciąż jest to działające rozwiązanie dla małych tablic. BR. –

+1

Dopóki nie zostanie to zrobione w krytycznej części aplikacji, a dane są raczej niewielkie, wykonają swoją pracę w łatwy do zrozumienia sposób. – flu

1

Spójrz na moim poniższym fragmencie Aby posortować tablicę na podstawie innej tablicy:

$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

Naprawdę nie ma sensu sortowanie wartości '$ data' według wartości. Ponieważ '$ sortingArr' nie może być wartościami malejącymi. Również użycie 'tablica_flipów', a następnie' krsort' jest po prostu brzydkie, możesz użyć 'rsort' bezpośrednio. – HamZa

+0

$ sortingArr również posortowane w porządku malejącym przy użyciu rsort. Obie tablice są teraz dostępne w porządku malejącym – Sundar

8

o szczegółową odpowiedź, dlaczego array_multisort robi nie odpowiada Twoim potrzebom, zobacz tę odpowiedź, proszę: PHP array_multisort not sorting my multidimensional array as expected

W skrócie: Chcesz posortować tablicę na podstawie predefiniowanego zamówienia. Odpowiedź jest również podane tam, ale kopiowane jedno rozwiązanie tej odpowiedzi, zbyt:

Zastosowanie usort i array_flip, więc można włączyć tablicę indeksowania (ValueByPosition) do 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) 

Wymagałoby to jednak przewidywania wszystkich możliwych pozycji w ramach wstępnie zdefiniowanej tablicy zamówień lub wątkowania innych elementów w odpowiedni sposób.

Jeśli chcesz zachować klucze assoc, użyj uasort zamiast usort.

0

użyciu usort()the right way myślę

Sortuj tablicę według wartości korzystając użytkownika funkcji porównującej zdefiniowanej

można zrobić następująco:

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

żywo przykład: https://3v4l.org/75cnu

Powiązane problemy