Цикл по массивам и добавление по индексу в другой массив - PullRequest
0 голосов
/ 02 ноября 2018

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

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"
}

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

Ответы [ 4 ]

0 голосов
/ 03 ноября 2018

Если вы носите носки, вы можете повесить их. Техника, которую вы ищете, называется «транспонирование массива». Пока вы удаляете внешние ассоциативные ключи, 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 голосов
/ 02 ноября 2018

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

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 голосов
/ 02 ноября 2018

Я бы предложил сделать следующее для тех, кто работает с версией 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

Демо

0 голосов
/ 02 ноября 2018

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

<code>   $_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 "
";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...