2012-01-19 22 views
9

Mam szereg produktów i chcę je posortować za pomocą innej tablicy.Sortowanie tablicy przy użyciu innej tablicy

$products = array(
    0 => 'Pro 1', 
    1 => 'Pro 2', 
    2 => 'Pro 3' 
); 

$sort = array(1,2,0); 

array_multisort($products, $sort); 

Array powinny teraz być ...

$products = array(
    0 => 'Pro 2', 
    1 => 'Pro 3', 
    2 => 'Pro 1' 
); 

I nie wydają się być za pomocą array_multisort poprawnie. Próbowałem już na 2 godziny ...

+1

Czy indeksy elementów zawsze pasują do liczb w tablicy '$ sort'? –

+0

Myślę, że z 'array (1,2,0)' powinno być '3,1,2', kiedy chcesz' 2,3,1' powinieneś użyć 'array (2,0,1)' – Vyktor

+1

Vyktor jest poprawne, jeśli chcesz użyć 'array_multisort ($ sort, $ products)', tablica musi mieć postać '[2,0,1]'. Pomyśl o tym w kategoriach "Chcę, aby pierwszy element" $ products' był @ index 2, drugi element miałby być w indeksie 0, a trzeci element byłby w indeksie 1. " Przy obecnej tablicy wystarczy użyć jakiejś formy iteracji (to jest 'array_map'), co ilustrują podane odpowiedzi. – Matthew

Odpowiedz

9

Wydaje się, że jest to bardziej właściwe niż sortowania:

$products = array_map(function($i) use ($products) { 
    return $products[$i]; 
}, $sort); 
+0

Właściwie, czy istnieje inny sposób napisania tego? Dreamweaver uważa, że ​​jego nieprawidłowy php – tuurbo

+0

@tuurbo, jest poprawny dla PHP 5.3+. Czy Dreamweaver uzna to za ważne, nie ma znaczenia ... Każda z pozostałych odpowiedzi będzie działać na starszych wersjach PHP. – Matthew

1

array_multisort sortuje 2. tablicę i stosuje kolejność sortowania do pierwszej. Aby wykonać swoją pracę, tablica sortująca musi być $sort = array(2,0,1); (implikuje: przenieś drugi element do 0, trzeci element do 1 i 1 element do 2).

po prostu można użyć

foreach ($sort as $key) { 
    $sorted_products[] = $products[$key]; 
} 
+0

+1, ponieważ gdybym to przeczytał wcześniej, nie musiałbym komentować samego pytania. – Matthew

1

array_multisort() nie zrobi tego, co staramy się osiągnąć z danym kodzie.

Oto funkcja, która będzie:

function sort_by_other_array ($input, $order) { 
    $result = array(); 
    foreach ($order as $item) { 
    $result[] = $input[$item]; 
    } 
    return $result; 
} 

nie sprawdzanie błędów, ale zrobi to, co chcesz. Być może trzeba będzie dodać kontrole, aby upewnić się, że klucze określone w $order są obecne w $input.

Powiązane problemy