Цикл по массивам и добавление по индексу в другой массив

У меня есть массив, который выглядит так:

array(8) {
["rentalPropertyAddress"]=>
array(15) {
[0]=>
string(11) "111 tree st"[1]=>
string(11) "112 tree st"[2]=>
string(11) "122 tree st"}
["gasInitialized"]=>
array(15) {
[0]=>
string(2) "on"[1]=>
string(2) "on"[2]=>
string(3) "off"}
["waterInitialized"]=>
array(15) {
[0]=>
string(3) "off"[1]=>
string(2) "on"[2]=>
string(2) "on"}
["electricInitialized"]=>
array(15) {
[0]=>
string(2) "on"[1]=>
string(2) "on"[2]=>
string(3) "off"}
["inspectionDate"]=>
array(15) {
[0]=>
string(0) ""[1]=>
string(0) ""[2]=>
string(0) ""}
["rentalDate"]=>
array(15) {
[0]=>
string(0) ""[1]=>
string(0) ""[2]=>
string(0) ""}
["vacantInitialized"]=>
array(15) {
[0]=>
string(2) "no"[1]=>
string(2) "no"[2]=>
string(3) "yes"}
}

Что мне нужно сделать, это добавить каждый индекс каждого массива в другой массив или массив. Например, ожидаемый результат будет:

array {
array {
[0] => string(11) "111 tree st"[1] => string(2) "on"[2] => string(3) "off"[3] => string(2) "on"[4] => string(0) ""[5] => string(0) ""[6] => string(2) "no"}
...
}

Я попытался сделать это с помощью forloop, просматривая массив и сохраняя и индексируя его:

$i = -1;
$retval = array();
foreach ($_GET as $key => $item) {
$i += 1;
$retval[$i] = $item[$i];
}
echo "<pre>";var_dump($retval);

Но результат не тот, что я ожидал:

array(8) {
[0]=>
string(11) "111 tree st"[1]=>
string(2) "on"[2]=>
string(2) "on"[3]=>
string(3) "off"[4]=>
string(0) ""[5]=>
string(0) ""[6]=>
string(3) "yes"[7]=>
string(1) "5"}

Как я могу успешно извлечь данные из массива в разные массивы?

0

Решение

Если я не понял ваш требуемый вывод тогда вы можете использовать два foreach() выполнять итерацию каждого вложенного массива и помещать каждый элемент по позиции индекса всего вложенного массива.

   $_GET = [
"rentalPropertyAddress"=>["111 tree st","112 tree st","122 tree st"],
"gasInitialized"=>["on","on","off"],
"waterInitialized"=>["off","on","on"],
"electricInitialized"=>["on","on","off"],
"inspectionDate"=>["","",""],
"rentalDate"=>["","",""],
"vacantInitialized"=>["no","no","yes"]
];

$retval = [];
foreach ($_GET as $key => $item) {
$i=0;
foreach($item as $k=>$v){
$retval[$i][] = $v;
$i++;
}
}
echo "<pre>";
print_r($retval);
echo "</pre>";

DEMO: https://3v4l.org/LrpGo

0

Другие решения

Общий шаблон для переключения столбцов в строки:

foreach ($a as $row) {
foreach ($row as $col => $value) {
$result[$col][] = $value;
}
}

Тем не менее, вы можете получить этот результат в суперглобальном файле без необходимости преобразовывать его с помощью PHP, переименовывая входные данные формы (предполагая, что данные поступают из формы) из чего-то вроде

<input type="text" name="rentalPropertyAddress[]">
<input type="text" name="rentalPropertyAddress[]">

в этот формат

<input type="text" name="properties[0][rentalPropertyAddress]">
<input type="text" name="properties[1][rentalPropertyAddress]">

Это все еще возможно, даже если вы динамически добавляете строки с помощью JS.

0

Если вы носите носки, вы можете повесить их. Техника, которую вы ищете, называется «транспонирование массива». Пока вы удаляете внешние ассоциативные ключи, array_map() и оператор сплат (...) быстро подготовит ваши данные.

var_export(array_map(null,...array_values($_GET)));

Да, это действительно так ТОТ легко. демонстрация

Единственный способ сделать это легче, чем это, если вы будете следовать советам Don’tPanic и подготовить свою структуру данных обратно в HTML-форму.

Выход:

array (
0 =>
array (
0 => '111 tree st',
1 => 'on',
2 => 'off',
3 => 'on',
4 => '',
5 => '',
6 => 'no',
),
1 =>
array (
0 => '112 tree st',
1 => 'on',
2 => 'on',
3 => 'on',
4 => '',
5 => '',
6 => 'no',
),
2 =>
array (
0 => '122 tree st',
1 => 'off',
2 => 'on',
3 => 'off',
4 => '',
5 => '',
6 => 'yes',
),
)
0

Я бы предложил сделать следующее для тех, кто работает с версией php от 7.1 до 7.3 (см. Демонстрационную ссылку, например):

/*The initial array : I chose this one as it is simpler than the one in the question and I find it better for illustration purposes*/
/*Considering the question, we will only get the values ended by 0 (first value of each subarray )*/
$arrays = [['00','01'],['10','11'],['20','11']];

/*Initialisation of the result array*/
$indexes = [];

/*We are going to use the new syntax for list() function introduced in php 7.1  (See the credits link for list() function usage examples )*/

/* We pull the first value (index 0) of each subarray that we store in the result array ($indexes) */

foreach($arrays as $array){
list('0'=>$indexes[]) = $array;
}

var_dump($indexes); // ['00','10','20']

Кредиты: Функция списка & практическое использование деструктуризации массива в PHP

демонстрация

-1
По вопросам рекламы [email protected]