如何在PHP中使用嵌套数组创建HTML数据属性字符串?

时间:2016-08-29 12:47:03

标签: php arrays iterator

前段时间我不得不将嵌套的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部分)等内容。我无法获得的部分是关键 - 获得价值很容易。欢迎任何建议。

2 个答案:

答案 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);
}

感谢大家的意见。它帮助我更清楚地定义了我的搜索。还获得了一些关于迭代器的新知识。