Алгоритм преобразования массива в нестандартную форму

mus

Новичок
Алгоритм преобразования массива в нестандартную форму

Решаю нестандартную проблему, а именно, нужно преобразовать массив вида
Massiv = Array(
[title] => Array(
[0] = 5,
[1] = 10
),
[price] => Array(
[0] = 20,
[1] = 100
)
)
в следующий массив
arr[name][0] = "Massiv[title][0]";
arr[value][0] = "5";
arr[name][1] = "Massiv[title][1]";
arr[value][1] = "10";
и так далее...

Смысл в том, чтобы представить массив в строковом варианте, а не в структурном.
Прошу помочь с алгоритмом. Есть идея решить задачу с помощью вызова рекурсивной функции, которая будет идти вниз по дереву массива и выстраивать полный путь до конечного элемента, после чего будет возвращать массив из строкового значения имени и значения (тоесть arr[name] => Array([name] => "Massiv[title][0]", [value] => "5"), но для этого нужно использовать внутренний указатель, ведь функция должна быть рекурсивна, так как мы не знаем, насколько сильно будет вложенным массив...

Есть идеи?
 

mus

Новичок
Wicked
Долго рассказывать...
Хотя ладно.

Делаю проект, полностью на Ajax'е, у меня есть форма, на форме товары представлены в виде <SELECT><OPTION>, так вот, селектор изначально пуст (да, следует заметить, что также использую SMARTY), а заполнение селектора производится с помощью javaScript. Алгоритм и принцип работы следующий:
JavaScript функция-фраппер выполняет запрос на сервер (с помощью Ajax) и получает объект всех товаров, затем заполняет селектор. На странице есть форма добавления товаров. Если человек вбил название товара в соответствующее поле и нажал сохранить, перезагрузки не происходит, данные посылаются в JavaScript функцию-враппер, она в пхп-функцию аналог, та, в свою очередь, добавляет информацию в базу данных, после чего следует запрос о товарах вновь и селекторы на странице автоматически обновляются.

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

C помощью PHP формируем массив, в котором указываем, что было передано в массиве $_REQUEST, тоесть после перезагрузки страницы (отсылки формы), все значения будут переданы в JavaScript, та сравнит их и сделает выбранным тот <OPTION>, который и был до этого.

НО, есть загвоздка, у меня имя селектора выглядит как двумерный массив, и вообще все имена формы представлены в виде массива, поэтому когда я пытаюсь сделать так:

$list->request->length = count($_REQUEST);
$i = 0;
foreach($_REQUEST AS $key=>$value) {
$list->requestItem[$i]->name = $key;
$list->requestItem[$i++]->value = $value;
}

и далее сравнение такое:

selector = "post_new_order[title]["+k+"]";
ProductionList = document.forms["post_new_order_form"].elements[selector];
Selectbox.removeAllOptions(ProductionList);
selectedID = null;
for(i = 0; i < obj.request.length; i++) {
if(obj.requestItem.name == selector)
selectedID = obj.requestItem.value;
else
selectedID = null;
}

ничего не выходит, так как в javascript название селектора представлено строкой, а там, в пхп, мы имеем структуру, которую лишь следует представить в виде строки, что я и пытаюсь тщетно реализовать...
 

ksnk

прохожий
Проще написать :)
PHP:
$ar=array(array(1,2),'hello',array(12,3,array(4,5,6)),'x'=>'y');
$i=0;
function wr_ar($name,$ar) {
  global $i;
  foreach ($ar as $k=>$v) {
    if (is_array($v))
      wr_ar($name."[$k]",$v);
    else {
      printf('arr[name] [%d] = '.$name."[%s];\n".
             "arr[value][%d] = %s;\n",$i,$k,$i,$v);
      $i++;
    }
  }
};
wr_ar('ar',$ar);
 

ksnk

прохожий
Shicoo
там внутри есть преобразование PHP array-> JS array, но не такое...
 

mus

Новичок
ksnk
А вот такой вопрос. Для сего преобразования я передаю массив $_REQUEST и мне надо, чтобы в конечном итоге я освободился от этого массива и представил все вложенные в него массивы самостоятельно, например, есть следующая структура:
$_REQUEST['form1']['price'][0] = 5;
$_REQUEST['form1']['price'][1] = 10;

Так вот, следует преобразовать сие в такой массив:
arr[name][0] = "form1[price][0]";
arr[value][0] = 5;
arr[name][1] = "form1[price][1]";
arr[value][1] = 10;

Тоесть все также, но чтобы не было в качестве имени, то, что сейчас ("ar[form1][price][0]")
Вот так сделать можно? Буду премного благодарен!
 

ksnk

прохожий
в чем измерить благодарность?
Посмотри, пожалуйста на мой код и догадайся сам, откуда там берется это самое 'ar' и какой второй параметр нужно передать. Это не очень сложно :)
 

mus

Новичок
ksnk
ar берется как первоначальный name для рекурсии, а что за второй параметр - непонятно. Хотя постараюсь разобраться.

P.S. очень тороплюсь, извини, но не мог бы ты все же дать правильное решение? Голова болит уже... =(
 

ksnk

прохожий
Блин! Мозги полезно тренировать...
wr_ar('form1',$_REQUEST['form1']);
 

mus

Новичок
ksnk
Ой нееет...
Если бы все было так просто, я бы так и сделал.
То, что я передам именно $_REQUEST - это однозначно, так как эта функция запускается один раз и для всех массивов (для универсальности).

Этот вариант я рассматривал и отсек давно.

-~{}~ 13.09.06 21:09:

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

Был вариант просто передать "" в качестве первичного $name и затем, пройдя по сформированному массивy заменить первое [form1] на form1... ОТСЕК, криво...
 

ksnk

прохожий
Ok! Напиши, пожалуйста 10 строчек
wr_ar('form1',$_REQUEST['form1']);
wr_ar('form2',$_REQUEST['form2']);
...
посмотри на то, что получилось. Это - решение? Если решение, постарайся его оптимизировать, хотя и так сойдет...
 
Сверху