Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложность с перебором массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: помогите решить задачку
xyzdsnxyz
Отправлено: 26 Февраля, 2014 - 19:43:38
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2014  


Помог: 0 раз(а)




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

PHP:
скопировать код в буфер обмена
  1.  
  2. $data = array(
  3.     0 => array(
  4.         'paramID' => 3,
  5.         'paramTitle' => 'Материал',
  6.         'data' => array(
  7.             0 => array(
  8.                 'propTitle' => 'Железо',
  9.             ),
  10.             1 => array(
  11.                 'propTitle' => 'Дерево',
  12.             ),
  13.         ),
  14.     ),
  15.     1 => array(
  16.                 'paramID' => 5,
  17.         'paramTitle' => 'Объем',
  18.         'data' => array(
  19.             0 => array(
  20.                 'propTitle' => 'Большой',
  21.             ),
  22.             1 => array(
  23.                 'propTitle' => 'Средний',
  24.             ),
  25.         ),
  26.     ),
  27.     2 => array(
  28.         'paramID' => 1,
  29.         'paramTitle' => 'Цвет',
  30.         'data' => array(
  31.             0 => array(
  32.                 'propTitle' => 'Синий',
  33.             ),
  34.             1 => array(
  35.                 'propTitle' => 'Красный',
  36.             ),
  37.         ),
  38.     ),
  39. )


Как его можно привести к следующему виду?!
т.е. каждое значение из текущего вложенного массива складывается с каждым значением последующего массива...
PHP:
скопировать код в буфер обмена
  1.  
  2. $data = array(
  3.         0 => array(
  4.                 3 => 'Железо',
  5.                 5 => 'Большой',
  6.                 1 => 'Синий',
  7.         ),
  8.         1 => array(
  9.                 3 => 'Железо',
  10.                 5 => 'Большой',
  11.                 1 => 'Красный',
  12.         ),
  13.         2 => array(
  14.                 3 => 'Железо',
  15.                 5 => 'Средний',
  16.                 1 => 'Синий',
  17.         ),
  18.         3 => array(
  19.                 3 => 'Железо',
  20.                 5 => 'Средний',
  21.                 1 => 'Красный',
  22.         ),
  23.         4 => array(
  24.                 3 => 'Дерево',
  25.                 5 => 'Большой',
  26.                 1 => 'Синий',
  27.         ),
  28.         5 => array(
  29.                 3 => 'Дерево',
  30.                 5 => 'Большой',
  31.                 1 => 'Красный',
  32.         ),
  33.         6 => array(
  34.                 3 => 'Дерево',
  35.                 5 => 'Средний',
  36.                 1 => 'Синий',
  37.         ),
  38.         7 => array(
  39.                 3 => 'Дерево',
  40.                 5 => 'Средний',
  41.                 1 => 'Красный',
  42.         ),
  43. );
  44.  
 
 Top
MAXUS
Отправлено: 27 Февраля, 2014 - 16:13:56
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




xyzdsnxyz пишет:
Доброго времени суток форумчане, изучая массивы я столкнулся с одной проблемой которая недает мне никак покоя...
вот есть массив вида
Как его можно привести к следующему виду?!


Прям, заинтересовался... В итоге, для вашего случая (массив может сдержать любое количество элементов как на первом, так и на втором уровнях):
PHP:
скопировать код в буфер обмена
  1.  
  2. function get_combinations_xyzdsnxyz($data){
  3.         $comb=1;
  4.         foreach($data as $param) $k=$comb*=count($param['data']);
  5.        
  6.         foreach($data as $param){
  7.                 $c_param++;
  8.                 $jump=$k;
  9.                 $k=$k/count($param['data']);
  10.                 $jump-=$k;
  11.                 $c_prop=0;
  12.                 foreach($param['data'] as $prop){
  13.                         $i=1+$c_prop*$k;
  14.                         $c_prop++;
  15.                         while($i<=$comb){
  16.                                 $output[$i][$param['paramID']]=$prop['propTitle'];
  17.                                 if($i%$k) $i++;
  18.                                 else $i+=$jump+1;
  19.                         }
  20.                 }
  21.         }
  22.         return $output;
  23. }
  24.  
  25. echo "<pre>";
  26. print_r(get_combinations_xyzdsnxyz($data));
  27. echo "</pre>";
  28.  



Для более общего случая.
PHP:
скопировать код в буфер обмена
  1.  
  2. //Простой многомерный массив. Общий случай...
  3. $data=array(
  4.         array("Железо", "Дерево", "Пластик"),
  5.         array("Большой", "Средний", "Маленький", "Никакой"),
  6.         array("Синий", "Красный", "Желтый")
  7. );
  8.  
  9. //Функция, которая возвращает массив с комбинациями.
  10. function get_combinations($data){
  11.         $comb=1;
  12.         foreach($data as $param) $k=$comb*=count($param);
  13.        
  14.         foreach($data as $param){
  15.                 $c_param++;
  16.                 $jump=$k;
  17.                 $k=$k/count($param);
  18.                 $jump-=$k;
  19.                 $c_prop=0;
  20.                 foreach($param as $prop){
  21.                         $i=1+$c_prop*$k;
  22.                         $c_prop++;
  23.                         while($i<=$comb){
  24.                                 $output[$i][$c_param]=$prop;
  25.                                 if($i%$k) $i++;
  26.                                 else $i+=$jump+1;
  27.                         }
  28.                 }
  29.         }
  30.         return $output;
  31. }
  32.  
  33. //Запускаем и смотрим, что получится
  34. echo "<pre>";
  35. print_r(get_combinations($data));
  36. echo "</pre>";
  37.  


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

(Отредактировано автором: 27 Февраля, 2014 - 16:22:27)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB