我正在尝试让这样的东西工作:
function posts_formatter (&$posts){
foreach ($posts as $k => $v){
if (is_array($v)){
posts_formatter($v);
}else{
switch (strtolower($k)){
# make email addresses lowercase
case (strpos($k, 'email') !== FALSE):
$posts[$k] = strtolower($v);
break;
# make postcodes uppercase
case (strpos($k, 'postcode') !== FALSE):
$posts[$k] = strtoupper($v);
break;
# capitalize certain things
case (strpos($k, 'line1') !== FALSE):
case (strpos($k, 'line2') !== FALSE):
case (strpos($k, 'line3') !== FALSE):
case (strpos($k, 'forename') !== FALSE):
case (strpos($k, 'surname') !== FALSE):
$posts[$k] = capitalize($v);
break;
}
}
}
}
它将正确地遍历数组并格式化值,但我无法让它返回它们。我试过从函数声明中删除 &
并在末尾添加一个 return,但它不会做任何事情。
此外,我在想也许使用 RecursiveArrayIterator
可能是可行的方法。然而,尽管我面前有一本书,其中有一章是关于 SPL 迭代器的,但它的示例对于实现我正在尝试的目标毫无用处。我将如何实现一个?
编辑:
array (
'user' =>
array (
'title' => 'Mr.',
'forename' => 'lowercase',
'surname' => 'name',
'businessName' => 'some dude',
'telephone' => '07545464646',
'postcode' => 'wa1 6nj',
'line1' => 'blergh road',
'line2' => 'randomLY cApitaLIzed wOrds',
'line3' => '',
),
'email' => 'CAPITALIZED@BLERGH.com',
'address' =>
array (
'postcode' => 'ab1 1ba',
'line1' => 'test road',
'line2' => 'testville',
'line3' => 'testshire',
),
'date' => '2010-09-30'
)
最佳答案
好的,这是一个让您快速了解的问题:
$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
中。要实现自定义功能,您可以子类化 RecursiveIteratorIterator
(如下所示)或使用其他迭代器来装饰 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 与函数名交换
关于php - 如何使用递归数组迭代器处理多维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829460/