перебрать многомерный массив php - получить весь индекс и взорваться в строку - PullRequest
0 голосов
/ 28 ноября 2018

Я застрял с частью моего кода, и я не могу понять, почему я получаю определенный результат.Моя цель состоит в том, чтобы перебрать массив и отобразить этот результат в виде строки:

Первый массив

  1. validate.required
  2. validate.remote

Второй массив

shop.cart.string

Текущий результат:

  1. validate.0.required
  2. validate.1.remote

Возвращает индекс из массива, как можно решить / удалить это из моей строки?

  private $translationKeys = [
    'validate' => [
      'required',
      'remote',
      'email',
      'url',
      'date',
      'dateISO',
      'number',
      'digits',
      'creditcard',
      'equalTo',
      'extension',
      'maxlength',
      'minlength',
      'rangelength',
      'range',
      'max',
      'min',
      'step'
    ],
    'shop' => [
        'cart' => [
         'string'
        ],
    ],
];

Это моя функция:

function listArrayRecursive($translationKeys) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($translationKeys), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $k => $v) {
  if ($iterator->hasChildren()) {
  } else {
    for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) {
      $p[] = $iterator->getSubIterator($i)->key();
      $y = array();
      foreach ($p as $value) {
        array_push($y, $value);
      }
    }
    $path = implode('.', $y); 
    $a[] = "$path.$v<br>";
    // Here i want to echo the string
  }
}

}

Вторая версия функции

  function listArrayRecursive($translationKeys) {
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($translationKeys), RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $k => $v) {
  if ($iterator->hasChildren()) {
  } else {
    for ($p = array(), $i = 0, $z = $iterator->getDepth(); $i <= $z; $i++) {
      $p[] = $iterator->getSubIterator($i)->key();
    }
    $path = implode('.', $p); 
    $a[] = "$path.$v<br>";
  }
}

}

Ответы [ 2 ]

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

Вот функция, которая даст вам желаемый результат.Он повторяется через каждый элемент массива, который является массивом, объединяет ключ со значениями или просто возвращает значение, если оно не является массивом:

function listArrayRecursive($array) {
    $list = array();
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            foreach (listArrayRecursive($value) as $v) {
                $list[] = "$key.$v";
            }
        }
        else {
            $list[] = $value;
        }
    }
    return $list;
}
print_r(listArrayRecursive($translationKeys));

Вывод:

Array (
    [0] => validate.required
    [1] => validate.remote
    [2] => validate.email
    [3] => validate.url
    [4] => validate.date
    [5] => validate.dateISO
    [6] => validate.number
    [7] => validate.digits
    [8] => validate.creditcard
    [9] => validate.equalTo
    [10] => validate.extension
    [11] => validate.maxlength
    [12] => validate.minlength
    [13] => validate.rangelength
    [14] => validate.range
    [15] => validate.max
    [16] => validate.min
    [17] => validate.step
    [18] => shop.cart.string 
)

Демо на 3v4l.org

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

попробуйте что-то вроде этого

function disp_array_rec($arr, $upper = null) {
    foreach ($arr as $k => $v) {
        echo ($upper != null ? $upper : "");
        if (is_array($v)) {
            disp_array_rec($v, $k . ".");
        } else {
            echo "$v\n";
        }
    }
}

disp_array_rec($translationKeys);

результат:

validate.required
validate.remote
validate.email
validate.url
validate.date
validate.dateISO
validate.number
validate.digits
validate.creditcard
validate.equalTo
validate.extension
validate.maxlength
validate.minlength
validate.rangelength
validate.range
validate.max
validate.min
validate.step
shop.cart.string
...