如何使用递归数组迭代器来处理多维数组?
我试图让这样的东西工作:
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' => '[email protected]',
'address' =>
array (
'postcode' => 'ab1 1ba',
'line1' => 'test road',
'line2' => 'testville',
'line3' => 'testshire',
),
'date' => '2010-09-30'
)
I'm trying to get something like this working:
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;
}
}
}
}
It will correctly go through the array and format the values but I can't get it to return them. I've played around with removing the &
from the function declaration and adding a return at the end but it won't do anything.
Additionally, I'm thinking perhaps using a RecursiveArrayIterator
might be the way to go. However, despite the presence of a book right in front of me with a chapter on SPL Iterators its examples are useless towards being able to achieve what I'm trying to. How would I go about implementing one?
Edit:
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' => '[email protected]',
'address' =>
array (
'postcode' => 'ab1 1ba',
'line1' => 'test road',
'line2' => 'testville',
'line3' => 'testshire',
),
'date' => '2010-09-30'
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,这里有一个供您快速了解的内容:
主要思想是影响
Iterator
返回current
元素的方式。迭代器是可堆叠的,因此您应该使用RecursiveArrayIterator
并将其包装到RecursiveIteratorIterator
中。要实现自定义功能,您可以子类化RecursiveIteratorIterator
(如下所示)或使用其他迭代器来装饰RecursiveIteratorIterator
:然后您只需
foreach
通过迭代器并 get
您可以尝试使用
iterator_to_array
或iterator_apply
函数获取数组。但是,要将值重新应用到原始数组结构,您不需要迭代器:注意:使用 PHP<5.3 时将 Lambda 与函数名称交换
Ok, here is a quick something for you to figure out:
The main idea is to influence how the
Iterator
returns thecurrent
element. Iterators are stackable, so you should use aRecursiveArrayIterator
and wrap it into aRecursiveIteratorIterator
. To achieve custom functionality, you can either subclass theRecursiveIteratorIterator
(as shown below) or use additional iterators to decorate theRecursiveIteratorIterator
:Then you simply
foreach
over the iteratorand get
You can try to get the array back from the with
iterator_to_array
oriterator_apply
functions. However, to get the values reapplied to the original array structure, you dont need an iterator:Note: exchange Lambda with Function name when using PHP<5.3