2016-08-02 3 views
0

У меня есть этот массив:PHP, Сортировка/слияния многомерный массив другой (меньший) массив

$original=[]; 
$original[]=['value'=>'a','count'=>10]; 
$original[]=['value'=>'b','count'=>15]; 
$original[]=['value'=>'c','count'=>23]; 
$original[]=['value'=>'d','count'=>40]; 
$original[]=['value'=>'e','count'=>25]; 

И этот массив, содержащий элементы, которые должны быть в начале исходного массива $:

$sort=['d','c']; 

Так что результат в конечном счете должны быть:

[ 
    (int) 0 => [ 
     'value' => 'd', 
     'count' => (int) 40 
    ], 
    (int) 1 => [ 
     'value' => 'c', 
     'count' => (int) 23 
    ], 
    (int) 2 => [ 
     'value' => 'a', 
     'count' => (int) 10 
    ], 
    (int) 3 => [ 
     'value' => 'b', 
     'count' => (int) 15 
    ], 
    (int) 4 => [ 
     'value' => 'e', 
     'count' => (int) 25 
    ], 
] 

Используя простой цикл это выполнимо, но есть хороший способ сделать это?

+0

должен ли ваш '$ массив sort' быть многомерным? Какое поведение вы ожидаете, например, для '$ sort = [['d', 'c'], ['b', 'a']]'? – wazelin

+0

№ $ sort содержит только ключи значений, ничего больше –

+0

Но в вашем примере это '$ sort = [['d', 'c']]'. – wazelin

ответ

0

Вы могли бы сделать это с помощью usort

$priority = ['d', 'c']; 
usort($original, function ($a, $b) use ($priority) { 

    $prioA = array_search($a['value'], $priority); 
    $prioB = array_search($b['value'], $priority); 

    if ($prioA !== false && $prioB !== false) { 
     if ($prioA < $prioB) return -1; 
     return 1; 
    } 
    if ($prioA !== false) return -1; 
    if ($prioB !== false) return 1; 

    return 0; 
}); 
+0

Спасибо! Это работает! Но как я могу получить $ sort там? Использование ['d', 'c'] не является опцией, потому что этот массив является динамическим –

+0

Я обновил с передачей '$ priority' на закрытие – NDM

+0

Ты лучший! –

Смежные вопросы