2015-03-05 3 views
1

У меня проблема с php, я пробовал искать, но я только больше смутился. Мне нужно отсортировать массив по другому массиву с использованием значения ключа «приоритет».PHP: Сортировка массива в соответствии с другим массивом

Это заказ, который мне нужно отфильтровать.

$custom_order = array(
    array('priority' => 0, 'field_id' => 'password'), 
    array('priority' => 1, 'field_id' => 'username') 
); 

И это массив, который должен быть отфильтрован

$default_order = array(
    'name' => array(
     'username' => array(
      'type'  => 'text', 
      'priority' => 0 
     ), 
     'password' => array(
      'type'  => 'password', 
      'priority' => 1 
     ), 
    ), 
); 

И это для того, что я хотел бы получить

$final_order = array(
    'name' => array(
     'password' => array(
      'type'  => 'password', 
      'priority' => 0 
     ), 
     'username' => array(
      'type'  => 'text', 
      'priority' => 1 
     ), 
    ), 
); 

Я запутался, я не уверен, следует ли использовать uasort или array_intersect, читая другие статьи об этом, я стал более смущенным. Может кто-нибудь объяснить, как я могу сортировать массив таким образом?

Большое вам спасибо.

ответ

1

Если приоритет фактические критерии сортировки, то usort будет простой способ:

usort($array['name'], function($a, $b) { 
    return ($a->priority < $b->priority) ? -1 : 1; 
}); 

Это просто сравнивает значение приоритета между элементами массива. Если нет, возможно, вы могли бы улучшить свой пример, чтобы показать, как сортировка должна быть определена.

РЕДАКТИРОВАТЬ: На основе уточненного вопроса.

Из-за структуры ваших массивов я не верю, что вы сможете просто использовать функции PHP.

Во-первых, расставим приоритеты в форме лучше для prioritzing:

$priorities = array(); 
foreach ($custom_order as $item) { 
    $priorities[$item->field_id] = $item->priority; 
} 

Затем назначьте обновленные приоритеты элементов $ по умолчанию:

$final_order = array(); 
foreach ($default_order as $item) { 
    $item->priority = $priorities[$item->type]; 
} 

Затем сделать вид, первоначально предложил, чтобы получить их в приоритетный порядок:

usort($final_order['name'], function($a, $b) { 
    return ($a->priority < $b->priority) ? -1 : 1; 
}); 
+0

Простите, может быть, я плохо себя объяснил. Я обновил свой вопрос с более подходящим примером. Да, «приоритет» - это сравнительное значение, которое я бы хотел использовать. Я хочу, чтобы $ default_order сортировался на основе «приоритета», установленного в $ custom_order – alex05