2013-04-17 4 views
0

У меня есть список массивов (или объектов, они поступают из базы данных через функцию PDOfetchAll(), поэтому обе опции в порядке для меня). Я хочу преобразовать список массивов в ассоциативный массив массивов с ключом каждого массива, который является одним из его столбцов.Преобразование неассоциативного списка массивов в ассоциативный массив массивов

Я, очевидно, могу сделать цикл, но мне интересно, есть ли какая-то функция PHP, которая уже делает это, возможно, более эффективным способом.

Таким образом, чтобы проиллюстрировать это, предположим, что у меня есть массив (неассоциативную) с массивами внутри:

[0] => {'name' : 'Joe', 'surname' : 'Bloggs', 'id' : '12345'} 
[1] => {'name' : 'Sandy', 'surname' : 'Smith', 'id' : '54321'} 

Я хочу, чтобы преобразовать его в:

['12345'] => {'name' : 'Joe', 'surname' : 'Bloggs', 'id' : '12345'} 
['54321'] => {'name' : 'Sandy', 'surname' : 'Smith', 'id' : '54321'} 
+0

У вас есть предметы или массивы? – adeneo

+0

@adeneo У меня есть ассоциативные массивы (внутренне) на данный момент, но я могу легко их изменить к объектам, если это необходимо. Просто вопрос об изменении на «PDO :: FETCH_OBJ». Поэтому оба варианта ОК для меня, если существует элегантный метод (который не включает цикл). – jbx

ответ

5

Простой цикл будет делать , но это слишком скучный, чтобы опубликовать ответ на, так что здесь вы идете:

$array = array_combine(array_map(function (array $row) { return $row['id']; }, $array), 
         $array); 

Если вы неравнодушны к functional PHP:

$array = array_combine(F\pluck($array, 'id'), $array); 
+0

LOL :), ну да не ищу простой цикл, который я могу легко сделать. Считаете ли вы, что это более эффективно? – jbx

+0

Нет, поскольку он 1) дважды перебирает массив и 2) хранит отдельный массив идентификаторов в памяти. Вы можете оптимизировать это с помощью цикла. Наверное, не имеет большого значения для средних размеров массива. – deceze

+0

Насколько мне известно, функция array_map нуждается в «вызываемом» в качестве первого параметра, а массив нет. – arraintxo

-1
$rows = $stmt->fetch(PDO::FETCH_ASSOC); 

или

$rows = $stmt->fetchall(PDO::FETCH_ASSOC); 

Давайте прочитаем, что HashPHP сказал:

Обратите внимание на использование PDO :: FETCH_ASSOC в выборку() и код fetchAll() выше. Это говорит PDO возвращать строки как ассоциативный массив с именами полей в качестве ключей. Другие режимы выборки, такие как PDO :: FETCH_NUM, возвращают строку в виде числового массива. По умолчанию используется выборка с PDO :: FETCH_BOTH, которая дублирует данные как с числовым, так и с ассоциативными ключами. Рекомендуется указывать один или другой, так что у нет массивов, размер которых в два раза больше! PDO также может извлекать объекты с PDO :: FETCH_OBJ и может принимать существующие классы с PDO :: FETCH_CLASS. Он также может связываться с определенными переменными с помощью PDO :: FETCH_BOUND и с использованием метода bindColumn.

+0

Как он узнает, в каком столбце я хочу быть ключом в ассоциативном массиве? Я думаю, что работает на внутренних индивидуальных массивах (что я уже делаю), я смотрю на внешний массив. – jbx

+1

это будет производить его 1-й массив, а не тот, который он хочет! – michi

+0

Поскольку @michi говорит, что не вернет массив, который он хочет, только тот, который у него есть. – arraintxo

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