2013-12-13 3 views
0

Я создаю веб-приложение, имеющее довольно большую (10K строк) справочную таблицу.Заполнение динамически созданных массивов в PHP

Ссылка на таблицу имеет категорию, идентификатор, описание.

Поскольку я использую эту ссылку, данные для заполнения раскрывающихся ящиков и т. Д., Я пытаюсь помещать их в массивы. Сначала я их в одном большом массиве, но мне кажется, что эффективнее иметь массив для каждой категории в справочной таблице.

Динамические имена переменных создаются, но заполнение их из другого массива не работает.

$r_refcats = mysqli_query($global_dbh,"select distinct(cat) from reference"); 
while(($row = mysqli_fetch_array($r_refcats)) != false){ $$row[0]=array();}; 

$r_references = mysqli_query($global_dbh,"select cat,id,description from reference"); 
while(($row = mysqli_fetch_array($r_references)) != false) { $$row[0]=array($row);} 

Потому что я не могу использовать $$row[0][] в последней строке, он держит перезапись то же значение :)

Любые советы о том, как сделать это правильно?

+0

Я думаю, что ваша предпосылка неверна: наличие большого количества динамически названных переменных не сделает PHP более эффективным, чем один массив с большим количеством динамических клавиш; Фактически, внутренние данные будут очень похожи. То, что это определенно сделает, это сделать ваш код более трудным для чтения и предотвратить использование встроенных функций массива или даже разделение кода на отдельные функции (так как вам придется каким-то образом передать все ваши переменные сразу). – IMSoP

+0

Мне нужно много раз перебирать массив, чтобы заполнить выпадающие окна. Это должно сэкономить некоторые условия, и каждый раз, когда я разделяю массивы в категориях, нужно циклически перебирать массив. Или я неправильно понимаю это? – MarlonB

+0

Вам не нужен один список со всеми входами, но внешний массив с категориями для ключей и отдельными списками для значений намного проще, чем у вас здесь. Доступ к одной категории, имя которой вы знаете заранее, просто потребует от вас ввести '$ categories ['foo']' вместо '$ foo'. OTOH, зацикливание * всех * категорий с полностью отдельными переменными было бы почти невозможным. – IMSoP

ответ

0

Вам нужно добавить в массив, а не просто переписать его:

$r_refcats = mysqli_query($global_dbh,"select distinct(cat) from reference"); 
while(($row = mysqli_fetch_array($r_refcats)) != false) { 
    ${$row[0]}=array(); 
} 

$r_references = mysqli_query($global_dbh,"select cat,id,description from reference"); 
while(($row = mysqli_fetch_array($r_references)) != false) { 
    ${$row[0]}[] = $row; 
} 

Кроме того, я думаю, вы просто хотите использовать $row как ваш массив, а не массив $row. Другими словами, я думаю, вы хотите, чтобы данные были данными в $row, а не array(0=>$row) - отсюда мое редактирование до последней строки.

+0

Спасибо! .. что сделал трюк :) – MarlonB

+0

Рад помочь! Не забудьте принять ответ, который поможет! :) –

+0

Ключевым понятием здесь является синтаксис '$ {$ name}', чтобы указать, что является именем динамической переменной и которое является действием на эту переменную. – IMSoP

0

Как насчет array_push(), он должен относиться к нему так же, как []:

while(($row = mysqli_fetch_array($r_references)) != false) { 
    //$$row[0]=array($row) 
    array_push($$row[0],array($row)); 
} 
Смежные вопросы