前段时间我不得不将嵌套的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
部分)等内容。我无法获得的部分是关键 - 获得价值很容易。欢迎任何建议。
答案 0 :(得分:1)
这可以通过一些简单的概念来实现,例如 loop , 递归函数和静态变量。
静态变量的使用在这里非常重要,因为它们记住了函数最后一次调用中的最后修改值。
在循环中,我们检查当前遍历的值是否为数组。
如果它是一个数组,我们用当前键修改前缀并调用递归函数和。
如果没有,我们只是简单地将前缀与当前密钥连接起来。
试试这个:
$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"
答案 1 :(得分:0)
因此,经过将近6个小时的尝试,以及Object Manipulator的一些提示,我发现这个answer on 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);
}
感谢大家的意见。它帮助我更清楚地定义了我的搜索。还获得了一些关于迭代器的新知识。