Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将关联数组映射到html元素属性?_Php_Arrays - Fatal编程技术网

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

Php 如何将关联数组映射到html元素属性?,php,arrays,Php,Arrays,我正在构建一个基本的表单构建类,以加快我的工作流程,我希望能够获得如下属性数组: $attributes = array( "type" => "text", "id" => "contact-name", "name" => "contact-name", "required" => true ); 并将其映射到html元素的属性: <input type="text" id="

我正在构建一个基本的表单构建类,以加快我的工作流程,我希望能够获得如下属性数组:

$attributes = array(
   "type"         => "text",
   "id"           => "contact-name",
   "name"         => "contact-name",
   "required"     => true
);
并将其映射到html元素的属性:

<input type="text" id="contact-name" name="contact-name" required />

编辑:


实现上述目标的最干净方式是什么?我相信我可以通过循环和一些连接来拼凑一些东西,但我感觉printf或类似的东西可以以更优雅的方式来完成。

这是一个非常简单的方法(当然,您可以扩展它,但这将为您提供基本的功能):

$output=”“;

我认为应该这样做:

$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))).' />';
$result='';

$attr=array(
'类型'=>'文本',
“id”=>“联系人姓名”,
“姓名”=>“联系人姓名”,
“必需”=>true,
'value'=>'html'test\'
);
回声';

老式的PHP4-5.2版本。这还允许为
属性设置一个数组

$attributes = array(
    "type"         => "text",
    "class"        => array("one", "two"),
    "id"           => "contact-name",
    "name"         => "contact-name",
    "required"     => true
);

printf(
    '<input %s />', 
    join(' ', array_map('mapAttr', array_keys($attr), array_values($attr)))
);

function mapAttr($key, $value) {
   if (is_array($value)) {
      return mapAttr($key, join(' ', $value));
   }
   if (is_bool($value)) {
      return $value ? $key : '';
   }
   return sprintf('%s="%s"', $key, $value);
}
$attributes=array(
“键入”=>“文本”,
“类”=>数组(“一”、“二”),
“id”=>“联系人姓名”,
“姓名”=>“联系人姓名”,
“必需”=>true
);
printf(
'', 
联接(“”,数组映射('mapatr',数组键($attr),数组值($attr)))
);
函数mapatr($key,$value){
if(是_数组($value)){
返回mapAttr($key,join(“”,$value));
}
如果(是布尔(价值)){
返回$value?$key:“”;
}
返回sprintf(“%s=”%s“,$key,$value);
}

由于http\u build\u查询是用于字符串化关联数组的,我希望在这里偶然发现这样一个解决方案。没有找到,因此我的“一行”如下:

$output = '<input ' . str_replace( '=', '="', http_build_query( $attributes, null, '" ') ) . '" />';

$output=”这是我在项目中使用的解决方案:

function html_attributes($attributes)
{
    if(!$attributes) return '';

    $compiled = join('="%s" ', array_keys($attributes)).'="%s" ';

    return rtrim(vsprintf($compiled, array_map('htmlspecialchars', array_values($attributes))));
}
我用这个:

function html_attributes(array $array) {
    return implode(' ', array_map(function ($key, $value) {
        if (is_array($value)) {
            $value = implode(' ', $value);
        }

        return $key . '="' . htmlspecialchars($value) . '"';
    }, array_keys($array), $array));
}
这个函数允许使用属性value.Ex的数组

$attrs = [
    'class' => ['foo', 'bar'],
    'id' => 'baz',
];

echo html_attributes($attrs);
// -> `class="foo bar" id="baz"`
'希望它能帮助别人!;-)

函数createdElement($tag,$attributes,$inner='',$closingTag=true)
{
返回“”。$内部($closingTag?“”:“”);
}
$input\u attrs=array(
'类型'=>'文本',
“占位符”=>“占位符”,
'值'=>'值'
);
//用于修改数组中的当前项(&F)
数组\u walk($input\u attrs,function(&$item,$key){
$item=$key.'='.$item'.'';
});
$input='';

这将是我的解决方案,希望能有所帮助

  • 使用===检查布尔值,并在一次检查中确认其为真
  • 使用addslashes对放置在双引号内的值进行双引号转义
  • 在数组本身上循环,并更新其自身的值以准备内爆
  • 将值与一个空格一起内爆,这意味着不需要修剪任何空白。布尔检查结果转换为“”的任何值都不会显示
看起来也比较短

foreach($attr as $k=>$v){
    $attr[$k] = $v===true?$k:"$k=\"".addslashes($v)."\"";
}
echo "<input ".implode(" ",$attr)." />";
foreach($attr as$k=>v){
$attr[$k]=$v==true?$k:“$k=\”。添加斜杠($v)。“\”;
}
回声“;

我还没有看到的东西,使用


那么问题是什么?如果你已经构建了这样一个类,你可能尝试了什么?还有@nostrzak说的;)我没有理解,问题在哪里,或者你到底想做什么:]问题是我如何将数组映射到HTML元素,这还不清楚吗?你想根据数组生成HTML吗?我已经提交了一个edit添加了对布尔元素的支持,如他的问题所示。谢谢,布尔元素特别有趣。根据您想要的HTML,可能不需要布尔值。HTML5就像您的示例一样,XHTML必须是
required=“required”
。正如对布尔值的注释一样,如果您添加以下代码片段:
if(is_bool($value)){$value=($value)?“true”:“false”}
$output
行上方的foreach循环中,它应该将布尔值转换为字符串,以便在属性中使用。不过,请注意@EduardLuca上面所说的,布尔值可能不是必需的。另外,我想注意的是,如果属性值是从不受信任的源获取的,则在输出之前应该对其进行转义(即用户输入)。您可以使用
rtrim()
删除最后一个属性处的空白:如果由于空格而出现多个属性,则Dclass属性将失败;
$attributes=str_replace(['=','+'],['=',''),http_build_query($attributes,null,''))
正如我在脚注3中指出的那样,这是正确的,还有解决方案。一个答案的代码块不是很好,特别是对于一个不完整的问题,已经给出了所有嘈杂的答案。可能是一些上下文?这个答案缺少教育性的解释。
$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
)) .' />';
$attributes = array(
    "type"         => "text",
    "class"        => array("one", "two"),
    "id"           => "contact-name",
    "name"         => "contact-name",
    "required"     => true
);

printf(
    '<input %s />', 
    join(' ', array_map('mapAttr', array_keys($attr), array_values($attr)))
);

function mapAttr($key, $value) {
   if (is_array($value)) {
      return mapAttr($key, join(' ', $value));
   }
   if (is_bool($value)) {
      return $value ? $key : '';
   }
   return sprintf('%s="%s"', $key, $value);
}
$output = '<input ' . str_replace( '=', '="', http_build_query( $attributes, null, '" ') ) . '" />';
function html_attributes($attributes)
{
    if(!$attributes) return '';

    $compiled = join('="%s" ', array_keys($attributes)).'="%s" ';

    return rtrim(vsprintf($compiled, array_map('htmlspecialchars', array_values($attributes))));
}
function html_attributes(array $array) {
    return implode(' ', array_map(function ($key, $value) {
        if (is_array($value)) {
            $value = implode(' ', $value);
        }

        return $key . '="' . htmlspecialchars($value) . '"';
    }, array_keys($array), $array));
}
$attrs = [
    'class' => ['foo', 'bar'],
    'id' => 'baz',
];

echo html_attributes($attrs);
// -> `class="foo bar" id="baz"`
function createDomElement($tag, $attributes, $inner = '', $closingTag = true)
{
    return '<' . $tag . ' ' . rtrim(join(' ', array_map(function ($key) use ($attributes) {
        return is_bool($attributes[$key]) ? $attributes[$key] : $key . '="' . $attributes[$key] . '"';
    }, array_keys($attributes)))) . '>' . $inner . ($closingTag ? '</' . $tag . '>' : '');
}
$input_attrs = array(
    'type' => 'text',
    'placeholder' => 'Placeholder',
    'value' => 'the value'
);

//Use & for modify current item in array
array_walk($input_attrs, function (&$item, $key) {
    $item =  $key . '="' . $item . '"';
});

$input = '<input '. implode(' ', $input_attrs) .' />';    
foreach($attr as $k=>$v){
    $attr[$k] = $v===true?$k:"$k=\"".addslashes($v)."\"";
}
echo "<input ".implode(" ",$attr)." />";