|
|
|
| Подскажите ,пожалуйста, как из двух массивов сделать один.
Два запроса вытягивают из базы категории и подкатегории.
//первый запрос, вытягиваем категории
получаем $cat['cat_name']
//второй запрос, вытягиваем подкатегории
получаем $subcat['cat_id'],$subcat['cat_name']
Из этого всего нужно сформировать один массив: ключи его - категории, значения - массивы подкатегорий.
array(
$cat['cat_name'] => array(
$subcat['cat_id']=> $subcat['cat_name'], $subcat['cat_id']=>$subcat['cat_name']),
$cat['cat_name'] => array(
$subcat['cat_id']=> $subcat['cat_name'], $subcat['cat_id']=>$subcat['cat_name'])
)
Т.е. должно быть что-то типа:
array(
'заголовок' => array(1=> 'Подзаголовок1', 2=>'Подзаголовок2'),
'заголовок' => array(3=> 'Подзаголовок3', 4=>'Подзаголовок4')
)
Пробовала и сама делать, но у меня категории в ключе выводятся каждый раз, когда есть подкатегория. | |
|
|
|
|
|
|
|
для: Лена
(16.09.2009 в 23:42)
| | Э... а почему не вытянуть эти два массива одним запросом?
>Пробовала и сама делать, но у меня категории в ключе выводятся каждый раз, когда есть подкатегория.
Но можно же проигнорировать эту самую категорию в тот момент, когда она не нужна? | |
|
|
|
|
|
|
|
для: Trianon
(16.09.2009 в 23:47)
| | Одним запросом и родителей, и потомков из одной таблицы? | |
|
|
|
|
|
|
|
для: Лена
(16.09.2009 в 23:55)
| | А я буду? без дампа?
ну пожалуй... array_combine() - это всё, что я могу ответить.
Но делать N+1 запрос вместо одного LEFT JOIN - кака! | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2009 в 00:04)
| | array_combine() - уже пробовала, ключи-категории в этом случае и дублируются.
LEFT JOIN уже завтра попробую, спать иду. | |
|
|
|
|
|
|
|
для: Лена
(17.09.2009 в 00:07)
| | >array_combine() - уже пробовала, ключи-категории в этом случае и дублируются.
не видя дампа, гадать неохота.
>LEFT JOIN уже завтра попробую, спать иду.
спокночи | |
|
|
|
|
|
|
|
для: Лена
(16.09.2009 в 23:55)
| | конечно.
а что одна таблица, так алиасами можно из одной несколько сделать. | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2009 в 00:16)
| |
<?php
$sql = "SELECT a.cat_id ac, b.cat_id bc, a.cat_name an, b.cat_name bn
FROM category a
LEFT JOIN category b ON a.cat_id = b.cat_pid
WHERE a.cat_pid =0
ORDER BY ac,bc";
$res = mysql_query($sql);
if(!$res) exit("Error in $sql: ". mysql_error());
for($i = 0;$cat = mysql_fetch_assoc($res);){
if($i !=$cat['ac']){
$i = $cat['ac'];
print $cat['an'] . "<br>";
}
print $cat['bn'] . "<br>";
}
?>
|
Теперь нужно $cat['an'] положить в один массив, а $cat['bn'] - в другой. И потом эти массивы склеить. Array_combine() не подходит здесь, потому что количество элементов в массивах разное, в первом будет - один, во втором - уже сколько есть подкатегорий. Или как-то изначально все запихивать в один массив. | |
|
|
|
|
|
|
|
для: Лена
(17.09.2009 в 11:03)
| |
<?
for($cats = array(), $i = 0; $cat = mysql_fetch_row($res);)
{
list($ac, $bc, $an, $bn) = $cat;
if($i != $ac)
$cats[$i = $ac] = array('n' => $an, 'l' => array());
if($bc !== null)
$cats[$i]['l'][$bc] = $bn;
}
|
если id'ы не нужны, массив (и код) можно упростить. | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2009 в 11:41)
| | Почему нельзя сделать вот так?
$cats[$i = $ac] = array($i => $an);
if($bc !== null)
$cats[$i][$i][$bc] = $bn;
Непонятно в коде все, что связано с 'l'.
>если id'ы не нужны,
id'ы нужны. У меня в шаблоне - селект-список, value опшенов - это и есть id'ы | |
|
|
|
|
|
|
|
для: Лена
(17.09.2009 в 13:36)
| | Вы пробовали пример?
>Почему нельзя сделать вот так?
$cats - массив $ac = 5, $bc = 7;
> $cats[$i = $ac] = array($i => $an);
$cats[5][5] = 'имя 5 категории' ;
> if($bc !== null)
> $cats[$i][$i][$bc] = $bn;
>
$cats[5][5][7] = $bn; - попытка присвоить 7-му символу имени 5-й категории строку имени 7 подкатегории.
это то, что Вы хотели получить?
>Непонятно в коде все, что связано с 'l'.
l - list - список подкатегорий.
>>если id'ы не нужны,
>id'ы нужны. У меня в шаблоне - селект-список, value опшенов - это и есть id'ы
в принципе, можно, конечно, держать информацию об имени категории в описании фиктивной подкатегории. Но отношение станет неортогональным, и обработка элементов такого массива окажется здорово затруднена. | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2009 в 14:11)
| | Тут все намного проще, чем вы сделали. Но все равно ваш код интересней.
Массив должен быть такой:
Array
(
[заголовок1] => Array
(
[1] => Подзаголовок1
[2] => Подзаголовок2
)
[заголовок2] => Array
(
[3] => Подзаголовок3
[4] => Подзаголовок4
)
)
Переделала, получилось:
<?php
for($cats = array(), $i = 0; $cat = mysql_fetch_row($res);$i++){
list($ac, $bc, $an, $bn) = $cat;
$cats[$an][$bc] = $bn;
}
?>
|
Спасибо.
Меня еще вот это удивило: $cats[$i = $ac] - такого раньше не видела. | |
|
|
|
|
|
|
|
для: Лена
(18.09.2009 в 00:00)
| | Если не нужны id категорий, тогда конечно.
а что до $cats[$i = $ac] , то просто полезно помнить, что в C-подобных языках (к коим тужится отнестись php) нет оператора присваивания. знак = это не оператор, а операция присваивания. Как + или * только проще. Операция, формирующая выражение. А значение выражения можно использовать в другом выражении - объемлющем.
Точно также , как значение выражения 2 * 3 используется в выражении 2 * 3 + 5 . | |
|
|
|
|
|
|
|
для: Trianon
(18.09.2009 в 00:09)
| | Если это операция, получается, можно даже(если понадобится) написать так: $cats[$i + $ac] ?
И значением этого выражения $cats[$i = $ac] будет $cats[$ac]? | |
|
|
|
|
|
|
|
для: Лена
(18.09.2009 в 00:22)
| | >Если это операция, получается, можно даже(если понадобится) написать так: $cats[$i + $ac] ?
А почему нет? Кто-то когда-то запрещал так писать?
>И значением этого выражения $cats[$i = $ac] будет $cats[$ac]?
Формально, значением будет $cats[$i] после выполнения присваивания.
Фактически, да $cats[$ac] | |
|
|
|