如何将关联数组映射到html元素属性?

ham*_*lin 13 php arrays

我正在构建一个基本的表单构建类,以加快我的工作流程,我希望能够采用如下的一系列属性:

$attributes = array(
   "type"         => "text",
   "id"           => "contact-name",
   "name"         => "contact-name",
   "required"     => true
);
Run Code Online (Sandbox Code Playgroud)

并将其映射到html元素的属性:

<input type="text" id="contact-name" name="contact-name" required />
Run Code Online (Sandbox Code Playgroud)

编辑:

实现上述目标的最简洁方法是什么?我确信我可以用循环和一些连接来拼凑一些东西,但我感觉printf或类似的东西可以以更优雅的方式做到.

Alm*_* Do 21

我认为应该这样做:

$result = '<input '.join(' ', array_map(function($key) use ($attributes)
{
   if(is_bool($attributes[$key]))
   {
      return $attributes[$key]?$key:'';
   }
   return $key.'="'.$attributes[$key].'"';
}, array_keys($attributes))).' />';
Run Code Online (Sandbox Code Playgroud)

  • 另外我想注意到,如果属性值是从不受信任的来源(即用户输入)获取的,则应在输出之前对其进行转义。 (2认同)

mol*_*aft 8

$attr = array(
    'type'     => 'text',
    'id'       => 'contact-name',
    'name'     => 'contact-name',
    'required' => true,
    'value'    => '" <b>html</b> \'test\''
);

echo '<input '. implode(' ', array_map(
    function ($k, $v) { return $k .'="'. htmlspecialchars($v) .'"'; },
    array_keys($attr), $attr
)) .' />';
Run Code Online (Sandbox Code Playgroud)


Edu*_*uca 5

沿着这些路线的东西(一个非常简单的方法——当然你可以扩展它,但这将为你提供基本功能):

$output = "<input ";
foreach($attributes as $key => $value){
    $output .= $key.'="'.$value.'" ';
}
$output .= "/>";
Run Code Online (Sandbox Code Playgroud)


小智 5

由于 http_build_query 用于字符串化关联数组,我希望在这里偶然发现这样的解决方案。没有找到,所以这是我的“单行”:

$output = '<input ' . str_replace( '=', '="', http_build_query( $attributes, null, '" ') ) . '" />';
Run Code Online (Sandbox Code Playgroud)

很遗憾:

  1. 它将布尔值转换为 1/0(而不是在为 false 时忽略它们,这可以通过使用 array_filter 来实现,但会导致双重函数调用);
  2. 不以所需的方式处理数组;
  3. 需要urldecode之后http_build_query取回编码的空格(例如,当一个属性中有多个 html 类时)。

所以,只适用于某些情况!