2013-08-05 2 views
0

Скажем я сделать запрос:PHP: Самый быстрый путь к базе данных хэша?

select * from branches 

Теперь я получаю результат:

ID | CODE | Name | etc... 
1 | ABC | One | etc... 
2 | BED | Two | etc... 
3 | CPE | Three | etc... 
4 | FEE | Four | etc... 

Я в конечном итоге с массивом, который может быть использован, как это:

$data[0]->name; 

Я хочу изменить этот массив, чтобы я мог так называть:

$data['ABC']->name; 

Каков самый быстрый способ преобразования массива, так что его ключ является одним из элементов массива? I.e. Предположительно без циклирования и назначения?

+1

Видимо, с чем вы имеете дело, это не 'массив', а объект. Вам придется преобразовать его вручную с помощью цикла foreach. – MightyPork

+0

Ну, это массив объектов, да. Но я надеялся, что будет простой способ сделать это, используя что-то вроде «array_keys» или что-то подобное. – coderama

+0

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

ответ

1

Это встроенное решение, если вы действительно хотите использовать компактный код.

Однако, я думаю, что это более беспорядочно, чем простой цикл foreach.

$arr = array(your obj array); 

$assoc = array(); 
array_walk($arr, function($v) {global $assoc; $assoc[$v->CODE]=$v;}); 

print_r($assoc); 
4

Простейшее решение для этого думаю.

$assoc = array(); 
$length = count($data); 

for($i = 0; $i < $length; $i++) { 
    $assoc[$data[$i]->CODE] = $data[$i]; 
} 

print_r($assoc); 

Хотя я считаю, что существует однострочное решение. Однако не могу вспомнить это с головы.

EDIT:

Измененный для условия цикла, хороший вызов Раймонда.

+0

Так я делаю это сейчас, но я надеялся, что это будет более быстрый способ сделать это. – coderama

+0

@coderama Тогда, если MightyPork знает об этом, тот, который, как я думал, действительно включал 'array_map', тем не менее, он все равно будет включать в себя итерацию, анонимную функцию вместо цикла. – Flosculus

+0

Вы можете сделать это с помощью 'array_map' или' array_walk', но это не будет «лучше» или «быстрее». Решение в этом ответе прекрасно. – Mahn

0

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

Что вы, вероятно, делаете!

while ($row = yourFetch) { 
    $data[] = $row; 
endwhile; 
return $data; 

Вы могли бы сделать это вместо того, чтобы: -

while ($row = yourFetch) { 
    $data[$row->CODE] = $row; 
endwhile; 
return $data; 

Тогда вам не придется добавить какой-либо обработки после события.

+0

Для получения результатов необязательно иметь цикл while, OP может вызывать нечто похожее на [PDO's fetchAll] (http://php.net/manual/en/pdostatement.fetchall.php) – Mahn

+0

@Mahn Ну в таком случае, если он хочет получить результат, он после того, как сможет изменить его и сэкономить на переформатировании массива. – RiggsFolly

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