2016-10-05 4 views
0

У меня есть два массива, один многомерный массив, который содержит информацию, а другой простой массив, который имеет значение для того, я хочу первый массив вPHP - Сортировка массива Ассоциативного по значениям другого массива

. Например, я хочу, чтобы мой первый массив упорядочивался по идентификатору по значениям во втором массиве.

$ пользователей массива:

array(3) { 
    [0] => array(3) { 
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
     }, 
    [2] => array(3) { 
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
     }, 
    [0] => array(3) { 
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
     }, 
} 

массив $ заказать:

array(3) { 
    [0] => '2', 
    [1] => '3', 
    [2] => '1', 
} 

Что я хотел бы исход отсортированного массива в:

array(3) { 
    [0] => array(3) { 
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
     }, 
    [2] => array(3) { 
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
     }, 
    [0] => array(3) { 
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
     }, 
} 

Так как вы можете см., я хотел бы, чтобы ключи массива были переиндексированы, поэтому они всегда последовательны, начиная с 0, но для значений каждого элемента i n массив $ users, подлежащий упорядочению.

+0

посмотрите на [array_multisort] (http://php.net/manual/en/function.array-multisort.php) – christophe

ответ

0

Я думаю, что это должно сделать работу:

$array = array(
    array(
      'id' => 2, 
      'name' => 'Jane Smith', 
      'email' => '[email protected]', 
    ), 
    array(
      'id' => 3, 
      'name' => 'Jack Smith', 
      'email' => '[email protected]', 
    ), 
    array(
      'id' => 1, 
      'name' => 'John Smith', 
      'email' => '[email protected]', 
    ), 
); 

function cmp_by_optionNumber($a, $b) { 
    return $a["id"] - $b["id"]; 
} 
usort($array, "cmp_by_optionNumber"); 

var_dump($array); 

Это будет сортировать ваш основной массив по значениям «ID» ключи в подмассивах.

+0

Это не дает ответа на вопрос – Thomas

0

Вы можете использовать usort для достижения этой цели:

 // the key order of each id 
     $orderIdKeys = array_flip($order); 

     usort($users, function ($u1, $u2) use ($orderIdKeys) { 

      // compare the keys of the ids in the $order array 
      return $orderIdKeys[$u1['id']] >= $orderIdKeys[$u2['id']] ? 1 : -1; 
     }); 

Тогда $users следует заказывать.

usort здесь сравнение пользователей на основе позиции (которая $orderIdKeys[$u1['id']]) каждого идентификатора пользователя в массиве $ заказа, если позиция из $u1['id'] больше позиции из $u2['id'] обратного вызова возвращает 1, что означает $u2 следует поместить перед $u1 в конечном упорядоченном массиве

0

Вы можете сделать это так:

// Index users by ID 
$users = array_combine(
    array_column($users, 'id'), 
    $users 
); 

// Order the users 
$users = array_map(function ($id) use ($users) { 
    return $users[$id]; 
}, $order); 

Здесь я использовал функцию array_combine(), которая создает массив, сопоставляя заданные ключи со значениями. Для ключей я использовал все идентификаторы в последовательном порядке (схватил их с array_column()).

Имея массив в таком виде, я могу перебрать массив $order и захватить значения от $users массивом по индексу, которые на самом деле имеют значение id.

Вместо петли с foreach Я использовал array_map() функцию. Если у вас есть коллекция (например, массив), лучше использовать higher order functions для их обработки. Если вы новичок, он может быть ошеломляющим, но вы должны это узнать, так как это происходит в наши дни.

Here is working example.

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