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
Форумы портала PHP.SU :: Версия для печати :: Помогите победить массивы
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Помогите победить массивы

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

1. Uchenik - 02 Января, 2014 - 16:31:41 - перейти к сообщению
Добрый вечер.
Хочу написать функцию, но никак не могу сообразить, дело вот в чем
функция принимает слово($var) и массив($array), затем создаёт них новый массив, ну например если передать в неё $var='HEAD'; и $array('Title'=>'Заголовок','Keyw'=>'ключевые,слова');
то функция вернёт
{HEAD.Title}='Заголовок';
{HEAD.Keyw}='ключевые слова';
Работает идеально, но если я передаю в неё массив, в формате
$array[0]['title']='Заголовок';
$array[0]['keyw']='ключевые слова';
функция возвращает не то что нужно, она вернёт что-то типа {HEAD.0}=Array('Title'='Заголовок','Keyw'=>'ключевые,слова');
Помогите переделать функцию для работы и с двумерными и с трёхмерными массивами
PHP:
скопировать код в буфер обмена
  1. function assign($var,$array)
  2. {
  3. foreach($array as $k=>$v)
  4.  {
  5.    if(!is_numeric($k))
  6.    {$newarray[count($newarray)]['{'.$var.'.'.$k.'}']=$v;}
  7.    else
  8.     {
  9.       foreach ($v as $key=>$value)
  10.         {}
  11.      }
  12.  }
  13.     print_r($newarray);
  14. }
  15. }
2. teddy - 02 Января, 2014 - 16:52:35 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. function asign($var, $arr){
  2.  
  3. foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)) as $key=>$value){
  4.     $output[] = $var.'.'.$key.'='.$value;
  5. }return $output;
  6.        
  7. }
  8. print_r(asign('HEAD', $arr));

Я победил массивы?
3. Uchenik - 02 Января, 2014 - 17:20:26 - перейти к сообщению
возможно я не совсем точно объяснил ситуацию, но во втором случае, когда я передаю массив с индексами, индексы элементов одинаковые, и мне бы хотелось чтобы на выходе из функции связь между элементами не терялась, ну вот например если я передаю массив
$Menu[0]['name']='Главная';
$Menu[0]['link']='?page=home';
$Menu[1]['name']='О Нас';
$Menu[1]['link']='?page=about';
, в Вашем случае вернется массив
[0] => MENU.name=Главная
[1] => MENU.link=?page=home
[2] => MENU.name=О Нас
[3] => MENU.link=?page=about
а не
[0] => MENU.name=Главная
[0] => MENU.link=?page=home
[1] => MENU.name=О Нас
[1] => MENU.link=?page=about
в этом собственно и вся проблема я понимаю что сохранение имеющихся индексов невозможно без обёртывания массива в новый массив со стандартной нумерацией индексов, т.е. в результате мы получим массив в котором структура будет что-то типа
[индекс][ключ][ключ]=значение
4. teddy - 02 Января, 2014 - 17:26:16 - перейти к сообщению
так в чем проблема? если вам нужны элементы этого массива то как минимум можно прогнать его через цикл или использовать массу других вариантов

пхп устроен так что массивы не могут иметь несколько одинаковых индексов. тоесть создать конструкцию типа
PHP:
скопировать код в буфер обмена
  1. $arr = [
  2.    0 => 'Vasya',
  3.    0 => 'Petya'
  4. ];

и сохранить при этом оба значения не получится

в крайнем случае можно сделать префиксы для каждого ключа если он является числовым но это извращение и не удобно будет обрабатывать...
5. Uchenik - 02 Января, 2014 - 17:55:27 - перейти к сообщению
teddy я как раз об этом и сказал в предыдущем посте =)
Ну т.е. чтобы на выходе получать всегда одинаковый стандартный размер массива (независимо от размера входящего массива) я предполагаю необходимо добавить индекс.
на выходе мне нужно получить массив в формате
[0][0][HEAD.Title]
[1][1][HEAD.Kw]
[2][0][MENU.Name]
[3][0][MENU.Title]
[4][1][MENU.Name]
[5][1][MENU.Title]
6. IllusionMH - 02 Января, 2014 - 18:14:09 - перейти к сообщению
Uchenik, так что ли?
Массив без вложенности
CODE (htmlphp):
скопировать код в буфер обмена
  1. array (size=2)
  2.   'Title' => string 'title' (length=5)
  3.   'Keys' => string 'key,words' (length=9)
  4.  
  5.  
  6. //результат
  7. array (size=2)
  8.   'HEAD.Title' => string 'title' (length=5)
  9.   'HEAD.Keys' => string 'key,words' (length=9)
  10.  


массив с 1 уровнем вложенности
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array (size=2)
  3.   0 =>
  4.     array (size=2)
  5.       'Title1' => string 'title1' (length=6)
  6.       'Keys1' => string 'key,words1' (length=10)
  7.   1 =>
  8.     array (size=2)
  9.       'Title2' => string 'title2' (length=6)
  10.       'Keys2' => string 'key,words2' (length=10)
  11.  
  12.  
  13. //результат
  14. array (size=2)
  15.   0 =>
  16.     array (size=2)
  17.       'HEAD.Title1' => string 'title1' (length=6)
  18.       'HEAD.Keys1' => string 'key,words1' (length=10)
  19.   1 =>
  20.     array (size=2)
  21.       'HEAD.Title2' => string 'title2' (length=6)
  22.       'HEAD.Keys2' => string 'key,words2' (length=10)
7. Uchenik - 02 Января, 2014 - 18:21:10 - перейти к сообщению
Не совсем понятно что делает Ваш код, в моём предыдущем посте я дал все пояснения. Нужно чтобы независимо от размера принимаемого массива на выходе получался стандартный массив.
8. IllusionMH - 02 Января, 2014 - 18:26:40 - перейти к сообщению
Uchenik, лично я по вашим объяснениям которые варьируются от примера к примеру ничего не понял.

В общем совет: проверяйте если $value это массив - вызывайте свою функцию еще раз(рекурсивно)

В моем примере: сначала входящий, потом полученный массив выведенные через var_dump для двух случаев: сверху массив без вложенности, снизу - с 1 уровнем вложенности. Подправил примеры.
Должен быть такой результат? Если нет - вручную соберите входящий и сходящий массивы и выложите их дампы.
9. caballero - 02 Января, 2014 - 18:27:43 - перейти к сообщению
размер массива зависит от того сколько данных туда воткнешь
непонятен вообще смысл проблеммы
10. Uchenik - 02 Января, 2014 - 18:34:34 - перейти к сообщению
IllusionMH я пробовал в функции делать проверку и повторно её вызывать (рекурсивно), это не дало нужного результата, индексы не сохранялись. ладно, попробую сам изобрести этот велосипед, позже отпишусь что получилось.
caballero
смысл проблемы был не в размере массива, а в том как в нём сохранялись данные Радость
ну в общем мне нужно чтобы независимо от размера входящего массива на выходе получался стандартный размер.
11. teddy - 02 Января, 2014 - 18:38:01 - перейти к сообщению
Uchenik пишет:
я как раз об этом и сказал в предыдущем посте

когда я писал это сообщение вы этого не говорили) уже после отредактировали

deleted
12. caballero - 02 Января, 2014 - 18:38:23 - перейти к сообщению
Цитата:
смысл проблемы был не в размере массива

Цитата:
чтобы независимо от размера входящего массива на выходе получался стандартный размер

противоречия не видишь?

и шо такое стандартный размер?
если ты туда присвоил 5 елементов там и будет пять елементов

а если функция не то возвращает то потому что ты в массив данные по разному заносишь.
13. Uchenik - 02 Января, 2014 - 18:45:31 - перейти к сообщению
caballero =)
Допустим в функцию может попасть массив $array[key]=value а может $array[key][key]=value а вернуться из функции должно в любом случае одно и тоже
$array[key][key]=value
Подмигивание
14. IllusionMH - 02 Января, 2014 - 18:49:59 - перейти к сообщению
Uchenik пишет:
IllusionMH я пробовал в функции делать проверку и повторно её вызывать (рекурсивно), это не дало нужного результата, индексы не сохранялись.

Uchenik, код в студию, а то там слишком просто, чтобы можно было ошибиться.
не забыли возвращенный результат присваивать в нужный элемент массива?
(Добавление)
teddy, а проще никак сделать нельзя? Зачем все эти нагромождения в данном случае?
15. Uchenik - 02 Января, 2014 - 18:53:03 - перейти к сообщению

Мелкий так усиленно наблюдает за темой, но ничего не говорит, ну прямо серый кардинал =)

IllusionMH пишет:
код в студию
не получится, уже стал делать по-другому. Вернулся к варианту из первого поста и начал оттуда проверять очередную теорию.

 

Powered by ExBB FM 1.0 RC1