Перебирать каждый ключ и значение в многомерном ассоциативном массиве PHP - PullRequest
0 голосов
/ 26 сентября 2018

Я только что узнал о парах ключ / значение.

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

У меня проблемы с выяснением, как перебирать этот многомерный ассоциативный массив без ошибок.

$arr = array(
  'test1' => array(
    'testing 1-1' => array('testing 1-1-1', 'testing 1-1-2', 'testing 1-1-3'),
    'testing 1-2' => array('testing 1-2-1', 'testing 1-2-2', 'testing 1-2-3'),
    'testing 1-3' => array('testing 1-3-1', 'testing 1-3-2', 'testing 1-3-3')),
  'test2' => array(
    'testing 2-1' => array('testing 2-1-1', 'testing 2-1-2', 'testing 2-1-3'),
    'testing 2-2' => array('testing 2-2-1', 'testing 2-2-2', 'testing 2-2-3'),
    'testing 2-3' => array('testing 2-3-1', 'testing 2-3-2', 'testing 2-3-3')),
  'test3' => array(
    'testing 3-1' => array('testing 3-1-1', 'testing 3-1-2', 'testing 3-1-3'),
    'testing 3-2' => array('testing 3-2-1', 'testing 3-2-2', 'testing 3-2-3'),
    'testing 3-3' => array('testing 3-3-1', 'testing 3-3-2', 'testing 3-3-3')));

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

Я пытаюсь отобразить все строки 1 на 1 через циклы foreach, но этоКажется, что само слово массив вызывает ошибку как-то.Я считаю, что это мой самый логичный подход к этому.

foreach ($arr as $test) {
  echo $test . '<br>';
    foreach ($test as $testing1) {
      echo '&nbsp&nbsp' . $testing1 . '<br>';
      foreach ($testing1 as $testing2) {
        echo '&nbsp&nbsp&nbsp&nbsp' . $testing2 . '<br>';
    }
  }
}

Хотя это приведет к следующему:

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 88
Array

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 1-1-1
    testing 1-1-2
    testing 1-1-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 1-2-1
    testing 1-2-2
    testing 1-2-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 1-3-1
    testing 1-3-2
    testing 1-3-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 88
Array

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 2-1-1
    testing 2-1-2
    testing 2-1-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 2-2-1
    testing 2-2-2
    testing 2-2-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 2-3-1
    testing 2-3-2
    testing 2-3-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 88
Array

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 3-1-1
    testing 3-1-2
    testing 3-1-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 3-2-1
    testing 3-2-2
    testing 3-2-3

Notice: Array to string conversion in /opt/lampp/htdocs/projects/form/phptest.php on line 90
  Array
    testing 3-3-1
    testing 3-3-2
    testing 3-3-3

Так что я хотел бы знать, есть ли что-то, что яотсутствует или это невозможно сделать?

ОБНОВЛЕНИЕ: Спасибо за ответы.

Это код, который я использовал на основе полученных ответов:

  foreach ($arr as $k => $test) {
    echo $k . '<br>';
      foreach ($test as $k1 => $testing1) {
        echo '&nbsp&nbsp' . $k1 . '<br>';
        foreach ($testing1 as $k2 => $testing2) {
          echo '&nbsp&nbsp&nbsp&nbsp' . $testing2 . '<br>';
      }
    }
  }

ОБНОВЛЕНИЕ:

Мне действительно нравится предложение HoldOffHunger.

<?php

    // Your Array Here

$arr = [...];

    // IterateArray() function

function IterateArray($data) {
    if(is_array($data)) {
        foreach ($data as $data_key => $data_value) {
            print("\n\n");
            print($data_key . ' :: ');
            print(IterateArray($data_value));
        }
    } else {
        print($data);
        print("\n");
    }
}

    // Call IterateArray()

IterateArray($arr);

?>

К сожалению, я не использовал эту рекурсивную функцию.Жесткое кодирование каждого экземпляра цикла позволяет мне делать разные вещи для каждого цикла вложенности.Хотя (и поправьте меня, если я ошибаюсь), это будет полезно, если каждое измерение многомерного массива будет повторять один и тот же код.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Добро пожаловать в SO!

Я хотел бы опубликовать решение, которое работает для любого типа массива, будь то 3-й, 4-й или любое измерение.Итак, почему бы не рекурсия , foreach() и is_array()?

IDEOne: онлайн-демонстрация / Sandox от IterateArray ()

<?php

    // Your Array Here

$arr = [...];

    // IterateArray() function

function IterateArray($data) {
    if(is_array($data)) {
        foreach ($data as $data_key => $data_value) {
            print("\n\n");
            print($data_key . ' :: ');
            print(IterateArray($data_value));
        }
    } else {
        print($data);
        print("\n");
    }
}

    // Call IterateArray()

IterateArray($arr);

?>

IterateArray() здесь будет печатать данные, если это не массив, и в противном случае он будет перебирать элементы массива и вызывать IterateArray() для этих элементов.

Приятная часть об этом решении: если ваша структура данных изменится, вашей функции не придется!

0 голосов
/ 26 сентября 2018

добро пожаловать в stackoverflow.Это уведомления, вы не должны использовать echo с массивами, вместо этого используйте print_r ($ ar) или var_dump ($ ar)

foreach ($arr6 as $test) {
  print_r($test);
    foreach ($test as $testing1) {
      print_r($testing1);
      foreach ($testing1 as $testing2) {
        print_r($testing2);
    }
  }
}

Вы также можете напечатать ключи следующим образом:

foreach ($arr6 as $mykey => $test) {
  echo $mykey;
  print_r($test);
0 голосов
/ 26 сентября 2018
   $arr = array(
  'test1' => array(
    'testing 1-1' => array('testing 1-1-1', 'testing 1-1-2', 'testing 1-1-3'),
    'testing 1-2' => array('testing 1-2-1', 'testing 1-2-2', 'testing 1-2-3'),
    'testing 1-3' => array('testing 1-3-1', 'testing 1-3-2', 'testing 1-3-3')),
  'test2' => array(
    'testing 2-1' => array('testing 2-1-1', 'testing 2-1-2', 'testing 2-1-3'),
    'testing 2-2' => array('testing 2-2-1', 'testing 2-2-2', 'testing 2-2-3'),
    'testing 2-3' => array('testing 2-3-1', 'testing 2-3-2', 'testing 2-3-3')),
  'test3' => array(
    'testing 3-1' => array('testing 3-1-1', 'testing 3-1-2', 'testing 3-1-3'),
    'testing 3-2' => array('testing 3-2-1', 'testing 3-2-2', 'testing 3-2-3'),
    'testing 3-3' => array('testing 3-3-1', 'testing 3-3-2', 'testing 3-3-3')));
    foreach ($arr as $key=>$val){
        echo $key;
        foreach($val as $k=>$v){
            echo $k;
            foreach($v as $ku=>$vu){
                echo $ku;    
            }
        }
    }

вы выводите массив, а не строку.

0 голосов
/ 26 сентября 2018

Оператор foreach имеет возможность перебора только значений, как вы делаете, или ключей и значений.Я подозреваю, что это то, что вы ищете:

foreach ($arr6 as $k=>$test) {
  echo $k . '<br>';
    foreach ($test as $k1=>$testing1) {
      echo '&nbsp&nbsp' . $k1 . '<br>';
      foreach ($testing1 as $k2=>$testing2) {
        echo '&nbsp&nbsp&nbsp&nbsp' . $testing2 . '<br>';
    }
  }
}

Вы получаете уведомления, потому что вы пытаетесь использовать echo для массива, что невозможно.

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