Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сформировать массив
 
 автор: Лена   (16.09.2009 в 23:42)   письмо автору
 
 

Подскажите ,пожалуйста, как из двух массивов сделать один.
Два запроса вытягивают из базы категории и подкатегории.
//первый запрос, вытягиваем категории
получаем $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')
)
Пробовала и сама делать, но у меня категории в ключе выводятся каждый раз, когда есть подкатегория.

  Ответить  
 
 автор: Trianon   (16.09.2009 в 23:47)   письмо автору
 
   для: Лена   (16.09.2009 в 23:42)
 

Э... а почему не вытянуть эти два массива одним запросом?

>Пробовала и сама делать, но у меня категории в ключе выводятся каждый раз, когда есть подкатегория.

Но можно же проигнорировать эту самую категорию в тот момент, когда она не нужна?

  Ответить  
 
 автор: Лена   (16.09.2009 в 23:55)   письмо автору
 
   для: Trianon   (16.09.2009 в 23:47)
 

Одним запросом и родителей, и потомков из одной таблицы?

  Ответить  
 
 автор: Trianon   (17.09.2009 в 00:04)   письмо автору
 
   для: Лена   (16.09.2009 в 23:55)
 

А я буду? без дампа?

ну пожалуй... array_combine() - это всё, что я могу ответить.

Но делать N+1 запрос вместо одного LEFT JOIN - кака!

  Ответить  
 
 автор: Лена   (17.09.2009 в 00:07)   письмо автору
 
   для: Trianon   (17.09.2009 в 00:04)
 

array_combine() - уже пробовала, ключи-категории в этом случае и дублируются.
LEFT JOIN уже завтра попробую, спать иду.

  Ответить  
 
 автор: Trianon   (17.09.2009 в 00:17)   письмо автору
 
   для: Лена   (17.09.2009 в 00:07)
 

>array_combine() - уже пробовала, ключи-категории в этом случае и дублируются.
не видя дампа, гадать неохота.

>LEFT JOIN уже завтра попробую, спать иду.
спокночи

  Ответить  
 
 автор: Trianon   (17.09.2009 в 00:16)   письмо автору
 
   для: Лена   (16.09.2009 в 23:55)
 

конечно.
а что одна таблица, так алиасами можно из одной несколько сделать.

  Ответить  
 
 автор: Лена   (17.09.2009 в 11:03)   письмо автору
 
   для: 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() не подходит здесь, потому что количество элементов в массивах разное, в первом будет - один, во втором - уже сколько есть подкатегорий. Или как-то изначально все запихивать в один массив.

  Ответить  
 
 автор: Trianon   (17.09.2009 в 11:41)   письмо автору
 
   для: Лена   (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;
}
print_r($cats);

если id'ы не нужны, массив (и код) можно упростить.

  Ответить  
 
 автор: Лена   (17.09.2009 в 13:36)   письмо автору
 
   для: 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'ы

  Ответить  
 
 автор: Trianon   (17.09.2009 в 14:11)   письмо автору
 
   для: Лена   (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'ы

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

  Ответить  
 
 автор: Лена   (18.09.2009 в 00:00)   письмо автору
 
   для: 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] - такого раньше не видела.

  Ответить  
 
 автор: Trianon   (18.09.2009 в 00:09)   письмо автору
 
   для: Лена   (18.09.2009 в 00:00)
 

Если не нужны id категорий, тогда конечно.
а что до $cats[$i = $ac] , то просто полезно помнить, что в C-подобных языках (к коим тужится отнестись php) нет оператора присваивания. знак = это не оператор, а операция присваивания. Как + или * только проще. Операция, формирующая выражение. А значение выражения можно использовать в другом выражении - объемлющем.
Точно также , как значение выражения 2 * 3 используется в выражении 2 * 3 + 5 .

  Ответить  
 
 автор: Лена   (18.09.2009 в 00:22)   письмо автору
 
   для: Trianon   (18.09.2009 в 00:09)
 

Если это операция, получается, можно даже(если понадобится) написать так: $cats[$i + $ac] ?
И значением этого выражения $cats[$i = $ac] будет $cats[$ac]?

  Ответить  
 
 автор: Trianon   (18.09.2009 в 00:36)   письмо автору
 
   для: Лена   (18.09.2009 в 00:22)
 

>Если это операция, получается, можно даже(если понадобится) написать так: $cats[$i + $ac] ?

А почему нет? Кто-то когда-то запрещал так писать?

>И значением этого выражения $cats[$i = $ac] будет $cats[$ac]?

Формально, значением будет $cats[$i] после выполнения присваивания.
Фактически, да $cats[$ac]

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования