如何使HTML数据属性字符串从嵌套数组在PHP


How can I make HTML data attributes string from a nested array in PHP?

前一段时间我不得不解析嵌套的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);
}

感谢大家的评论。它帮助我更清楚地定义了我的搜索。还学到了一些关于迭代器的新知识