use*_*291 8 php arrays multidimensional-array
阅读这个问题由几个数组合并和分组我得到了以下想法:当使用多级数组时,可能重复键,有一个函数可以迭代这样的数组,因为它是平的,就像
foreach(flatten($deepArray) as $key => $val)....
任何想法怎么写flatten()?有没有标准的解决方案?
(注意,flatten()由于重复键不能简单地返回一个新数组).
Yos*_*shi 13
$array = array( 
    0 => 'a', 
    1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))), 
    2 => 'b', 
    3 => array('subA','subB','subC'), 
    4 => 'c' 
);
foreach (return new RecursiveIteratorIterator(new RecursiveArrayIterator($array))
         as $key => $val) {
    printf(
        '%s: %s' . "\n",
        $key, $val
    );
}
/* Output:
0: a
0: subA
1: subB
0: subsubA
1: subsubB
0: deepA
1: deepB
2: b
0: subA
1: subB
2: subC
4: c
*/
扩展RecursiveIteratorIterator以返回当前的密钥堆栈
class MyRecursiveIteratorIterator extends RecursiveIteratorIterator
{
  public function key() {
    return json_encode($this->getKeyStack());
  }
  public function getKeyStack() {
    $result = array();
    for ($depth = 0, $lim = $this->getDepth(); $depth < $lim; $depth += 1) {
      $result[] = $this->getSubIterator($depth)->key();
    }
    $result[] = parent::key();
    return $result;
  }
}
foreach ($it = new MyRecursiveIteratorIterator(new RecursiveArrayIterator($array))
         as $key => $val) {
  printf('%s (%s): %s' . "\n", implode('.', $it->getKeyStack()), $key, $val);
}
/* Output:
0 ([0]): a
1.0 ([1,0]): subA
1.1 ([1,1]): subB
1.2.0 ([1,2,0]): subsubA
1.2.1 ([1,2,1]): subsubB
1.2.2.0 ([1,2,2,0]): deepA
1.2.2.1 ([1,2,2,1]): deepB
2 ([2]): b
3.0 ([3,0]): subA
3.1 ([3,1]): subB
3.2 ([3,2]): subC
4 ([4]): c
*/
还有另一个版本,这次没有使用RecursiveArrayIterator:
function flatten(array $array = array(), $keyStack = array(), $result = array()) {
  foreach ($array as $key => $value) {
    $keyStack[] = $key;
    if (is_array($value)) {
      $result = flatten($value, $keyStack, $result);
    }
    else {
      $result[] = array(
        'keys' => $keyStack,
        'value' => $value
      );
    }
    array_pop($keyStack);
  }
  return $result;
}
foreach (flatten($array) as $element) {
  printf(
    '%s: %s (depth: %s)' . "\n",
    implode('.', $element['keys']),
    $element['value'],
    sizeof($element['keys'])
  );
}
/*
0: a (depth: 1)
1.0: subA (depth: 2)
1.1: subB (depth: 2)
1.2.0: subsubA (depth: 3)
1.2.1: subsubB (depth: 3)
1.2.2.0: deepA (depth: 4)
1.2.2.1: deepB (depth: 4)
2: b (depth: 1)
3.0: subA (depth: 2)
3.1: subB (depth: 2)
3.2: subC (depth: 2)
4: c (depth: 1)
*/
| 归档时间: | 
 | 
| 查看次数: | 1210 次 | 
| 最近记录: |