好的,下面是一个很快让你发现的问题:
$data = array(
'title' => 'how to work with iterators',
'posts' => array(
array(
'title' => 'introduction to iterators',
'email' => 'JohnDoe@example.com'
), array(
'title' => 'extending iterators',
'email' => 'JaneDoe@example.com'
)
));
主要的想法是影响
Iterator
返回
current
元素。迭代器是可堆叠的,因此应该使用
RecursiveArrayIterator
把它包装成
RecursiveIteratorIterator
. 要实现自定义功能,可以将
递归迭代运算器
(如下所示)或使用其他迭代器来修饰
递归迭代运算器
:
class PostFormatter extends RecursiveIteratorIterator
{
public function current()
{
$current = parent::current();
switch($this->key()) {
case 'email':
$current = strtolower($current);
break;
case 'title':
$current = ucwords($current);
break;
default:
break;
}
return $current;
}
}
然后你简单地
foreach
通过迭代器
$it = new PostFormatter(new RecursiveArrayIterator($data));
foreach($it as $key => $post) {
echo "$key: $post", PHP_EOL;
}
得到
title: How To Work With Iterators
title: Introduction To Iterators
email: johndoe@example.com
title: Extending Iterators
email: janedoe@example.com
您可以尝试从中获取数组
iterator_to_array
或
iterator_apply
功能。但是,要使值重新应用于原始数组结构,不需要迭代器:
array_walk_recursive($data, function(&$val, $key) {
switch($key) {
case 'title': $val = ucwords($val); break;
case 'email': $val = strtolower($val); break;
default: break;
}
});
print_r($data);
注意:使用php<5.3时,将lambda与函数名交换