【问题标题】:loop through multidimensional array php - get all index and implode to string循环遍历多维数组php - 获取所有索引并内爆到字符串
【发布时间】:2018-11-28 11:26:30
【问题描述】:

我被我的一部分代码卡住了,我无法弄清楚为什么我会得到某个结果。我的目标是遍历数组并将这个结果作为字符串回显:

第一个数组

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

}

【问题讨论】:

  • 什么是$a?你想要的只是所有对象的内部路径?

标签: php arrays loops multidimensional-array


【解决方案1】:

这是一个可以为您提供所需结果的函数。它递归遍历数组的每个元素,将键与值连接起来,或者如果它不是数组则只返回值:

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 
)

Demo on 3v4l.org

【讨论】:

    【解决方案2】:

    试试这样的

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-28
      • 2012-04-21
      • 2011-01-02
      • 2016-02-16
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多