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)." />";