前一段时间我不得不解析嵌套的data
属性到JSON,所以我在so找到了一个JS解决方案。如:
data-title="Title" data-ajax--url="/ajax/url" data-ajax--timeout="10" data-ajax--params--param-1="Param 1"
['title' => 'Title', 'ajax' => ['url' => '/ajax/url', 'timeout' => 10, 'params' => ['param-1' => 'Param 1']]]
现在我需要在PHP中反向操作。我需要使属性字符串从嵌套数组使用它以后在HTML中。可以有无限个关卡
我试过递归函数。试过递归迭代器。还是没有运气。我总是丢失顶级键,得到data-ajax--url=[...] --timeout=[...] --param-1=[...]
(缺少-ajax
部分)之类的东西。我不能得到的部分是键-获取值很容易。欢迎大家多多指教
这可以通过一些简单的概念来实现,如循环,递归函数和静态变量。在这里使用静态变量非常重要,因为它们记住函数最后一次调用中最后修改的值。
在循环中,我们检查当前遍历的值是否为数组。
如果是数组,则用当前键修改前缀并调用递归函数and。
如果没有,则简单地将前缀与当前键连接起来。
试试这个:
$data = ['title' => 'Title', 'ajax' => ['url' => '/ajax/url', 'timeout' => 10, 'params' => ['param-1' => 'Param 1']]];
function formatter($data = array()) {
static $prefix = 'data-';
static $attr_string = '';
foreach($data as $key => $value) {
if (is_array($value)) {
$prefix .= $key.'--';
formatter($value);
} else {
$attr_string .= $prefix.$key.'="'.$value.'" ';
}
}
return $attr_string;
}
echo formatter($data);
输出:data-title="Title" data-ajax--url="/ajax/url" data-ajax--timeout="10" data-ajax--params--param-1="Param 1"
因此,经过近6个小时的尝试找出这个问题和大量的搜索,也有一些来自对象操纵器的提示,我在So上找到了这个答案,只需要根据我的需求进行调整:
function makeDataAttributes(array $attributes)
{
$rs = '';
$iterator = new 'RecursiveIteratorIterator(new 'RecursiveArrayIterator($attributes));
foreach ($iterator as $key => $value) {
for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) {
$key = $iterator->getSubIterator($i)->key() . '--' . $key;
}
$rs .= ' data-' . $key . '="' . $iterator->current() . '"';
}
return trim($rs);
}
感谢大家的评论。它帮助我更清楚地定义了我的搜索。还学到了一些关于迭代器的新知识