METANIT.COM

Передача многомерного массива php

В прошлых темах была рассмотрена отправка на сервер отдельных значений. Однако отправка набора значений, то есть массивов в PHP может вызвать некоторые сложности. Рассмотрим, как можно отправить на сервер и соответственно получить на сервере массивы данных.

Например, определим следующий файл users.php :

 echo "В массиве " . count($users) . " элементa/ов
"; foreach($users as $user) echo "$user
"; ?>

В данном случае мы предполагаем, что параметр «users», который передается в запросе типа GET, будет представлять массив. И соответствено мы сможем получить из него данные.

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

http://localhost/users.php?users[]=Tom&users[]=Bob&users[]=Sam

Чтобы определить параметр строки запроса как массив, после названия параметра указываются квадраные скобки []. Затем мы можем присвоить некоторое значение: users[]=Tom . И сколько раз подобным образом будет присвоено значений, столько значений и будет в массиве. Все значения, как и обычно, отделяются амперсандом. Так, в данном случае в массив передаются три значения.

Передача массивов в PHP на сервер в запросе GET

Подобным образом мы можем отправлять данные в запросе POST из формы. Например, определим следующий скрипт:

     "; foreach($users as $user) echo "$user
"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Как известно, название ключа передаваемых на сервер данных соответствует значению атрибута name у элемента формы. И чтобы указать, что какое-то поле ввода будет поставлять значение для массива, у атрибут name поля ввода в качестве значения принимает название массива с квадратными скобками:

Соответственно, сколько полей ввода с одним и тем же именем массива мы укажем, столько значений мы сможем передать на сервер. Так, в данном случае на сервер передается три значения в массиве users:

Отправка массивов на сервер методом POST из формы в PHP

Причем данный принцип применяется и к другим типам полей ввода формы html.

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

$firstUser = $_POST["users"][0]; echo $firstUser;

Но также мы можем в элементах формы явным образом указать ключи:

     $secondUser
$thirdUser"; > ?>

Форма ввода данных

User 1:

User 2:

User 3:

Например, первое поле добавляет в массив элемент с ключом «first»

Поэтому на сервере мы можем с помощью данного ключа получить соответствующий элемент:

$firstUser = $_POST["users"]["first"];

Источник

Как передать AJAX ом многомерный массив в PHP?

Уже колпак рвет, вторые сутки бьюсь и не получается решить задачу, гуру кодинга, посмотрите пожалуйста, что не так, почему в консоли распечатывает массив, а в php пустота прилетает?

Есть форма на сайте, с обычными полями типа email, phone и тд, и есть SELECTы пользовтельские, создаются автоматом, количество неизвестно, результат каждого выбора селекта сохраняем в два скрытых поля, 1 это название селекта, 2 это выбор option. В результате имеем (для примера результат работы 2 селектов):

1 результат работы селекта 2 результат работы селекта

Далее форма отправляется в form.js
Там куча проверок полей, анимации ошибок и тд, SERIALIZE поэтому не прокатит, так как все завязано на теге LABEL
пример

Так же и остальные поля, это я к тому что serialize не подходит, далее все летит в js

submitFu: function () < $.ajax(< type: "POST", url: _.mailHandlerURL, data: < name: _.getValFromLabel($('.name', _.form)), options: _.useroption // вот тут наш массив >, >) >, useroption: function()< var options = []; // передавать в пост можно только одномерный массив, // поэтому извращаемся с вот таким описанием данных' $('input.option', _.form).each(function (i) < options['option[' + i + '][name]'] = $(this).val(); options['option[' + i + '][val]'] = $(this).val(); >); console.log(options); >,

В php нихера ничего не прилетает, или я опять накосячил и тут

$options = ""; if (isset($_POST["options"])) < $options = $_POST["options"]; >foreach ($options as $value) < $result .= '  '.$value[name].' '.$value[val].'  ';>

Далее вывожу $result в нужном месте.

Так вот где я накосячил? Почему ничего не прилетает php? Или я в php не так вывожу, НО если serialize использовать то все в php работает и прилетает, но serialize не подходит. ПАМАГИТИИ!

Источник

Передача многомерного массива php

— Используйте подсветку синтаксиса при выделении исходного кода;
— В описании темы обязательно укажите язык программирования;
— Прежде чем задать вопрос, обязательно воспользуйтесь поиском и загляните в FAQ раздела.
— Если вопрос касается серверного ПО, указывайте ОС.
— Если вопрос касается ASP.NET то лучше будет задать его в соответствующем разделе. Там вы сможете получить ответ намного быстрее.

‘> Передача многомерного массива методом (POST, GET) . , PHP. Может это кому нибудь пригодится? (не смог, не поделица..)

uborshik, ну совсем уж, извините, баян.
Толку от такого не много, значение ни изменить ни получить на клиентской стороне.

Мне щас нужно стало, в Гугле не смог найти — «как отправить многомерный массив из формы».

Понятно. Просто я с Joomla, щас работаю: есть несколько компонентов, которые требуют для своего отображения, каждый свой стиль, при этом не нарушая общего стиля сайта.
Для этого (я сделал так), эти компоненты регистрируют названия своих файлов *.CSS в глобальном массиве, который затем должен (методом Пост) отправляца на главную (шаблон) страницу, которая, затем, подключит нужные CSS — файлы.

Вообще-то, можно «тупо» прописать линки этих файлов (всех CSS — файлов имеющихся для сайта) в шаблоне, и «забыть» (гм, тогда к чему разговоры о «тормознутости» Джумлы, при таком подходе?).
А можно подключать эти «линки» — динамически, по-мере необходимости. Т.е., просто, перебрать $GlobalCssPathArray= $_REQUEST[‘filepathcss’](unserialize($GlobalCssPathArray)), массив значений «линков», от всех подключаемых на данной странице компонентов и подключить необходимое.
В этом массиве может быть всего один, нужный нам, «линк», а может быть и (до бесконечности?) несколько.
С учетом, что Джумла при «дефолтных» настройках может подключить к абсолютно пустой странице сайта порядка 94 файлов, стоит задуматься об оптимизации?

Источник

Передача многомерного массива через POST с php

У меня есть php–форма, которая имеет известное количество столбцов (например, верхний диаметр, диаметр основания, ткань, цвет, количество), но имеет неизвестное количество строк, так как пользователи могут добавлять строки по мере необходимости.

Я обнаружил, как взять каждое из полей (столбцов) и поместить их в собственный массив.

Итак, что я получаю в HTML:

Теперь я хотел бы сделать все строки и столбцы, помещенные в многомерный массив, и отправить его содержимое клиенту (желательно в красиво отформатированной таблице). Я не смог по-настоящему понять, как объединить все эти входы и выбрать в хороший массив.

На этом этапе мне придется попытаться использовать несколько массивов 1D, хотя у меня есть идея, что использование одного 2D-массива будет лучше, чем использование нескольких 1D-массивов.

При отправке вы получите массив, как будто созданный следующим образом:

$_POST['topdiameter'] = array( 'first value', 'second value' ); $_POST['bottomdiameter'] = array( 'first value', 'second value' ); 

Тем не менее, я бы предложил изменить имена форм в этом формате:

name="diameters[0][top]" name="diameters[0][bottom]" name="diameters[1][top]" name="diameters[1][bottom]" . 

Используя этот формат, намного проще перебирать значения.

if ( isset( $_POST['diameters'] ) ) < echo ''; foreach ( $_POST['diameters'] as $diam ) < // here you have access to $diam['top'] and $diam['bottom'] echo ''; echo ' '; echo ' '; echo ''; > echo '
', $diam['top'], '', $diam['bottom'], '
'; >

вы можете представить все параметры с таким наименованием:

params[0][topdiameter] params[0][bottomdiameter] params[1][topdiameter] params[1][bottomdiameter] 

то позже вы сделаете что-то вроде этого:

foreach ($_REQUEST['params'] as $item)

Источник

Передача многомерного массива php

// Before php 5.4
$array = array(1,2,3);

// since php 5.4 , short syntax
$array = [1,2,3];

// I recommend using the short syntax if you have php version >= 5.4

Used to creating arrays like this in Perl?

Looks like we need the range() function in PHP:

$array = array_merge (array( ‘All’ ), range ( ‘A’ , ‘Z’ ));
?>

You don’t need to array_merge if it’s just one range:

There is another kind of array (php>= 5.3.0) produced by

$array = new SplFixedArray(5);

Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

Supposing a large string-keyed array

$arr=[‘string1’=>$data1, ‘string2’=>$data2 etc. ]

when getting the keyed data with

php does *not* have to search through the array comparing each key string to the given key (‘string1’) one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it’s all hidden away.

However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It’s also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).

When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:

$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => 23 ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=0, is_ref=0)int 23

but :
$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => ’23’ ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=1, is_ref=0)string ’23’ (length=2)
or :

$arr = [‘bebe’ => ‘Bob’, ‘age’ => [1,2], ‘too’ => [1,2] ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2
‘too’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2

This function makes (assoc.) array creation much easier:

function arr (. $array )< return $array ; >
?>

It allows for short syntax like:

$arr = arr ( x : 1 , y : 2 , z : 3 );
?>

Instead of:

$arr = [ «x» => 1 , «y» => 2 , «z» => 3 ];
// or
$arr2 = array( «x» => 1 , «y» => 2 , «z» => 3 );
?>

Sadly PHP 8.2 doesn’t support this named arguments in the «array» function/language construct.

Источник

Читайте также:  Тег INPUT
Оцените статью