2013-08-06 34 views
10

Tôi đang xây dựng một lớp học xây dựng hình thức cơ bản để tăng tốc độ công việc của tôi lên một chút và tôi muốn để có thể mất một mảng của các thuộc tính như vậy:Làm cách nào để ánh xạ mảng kết hợp thành thuộc tính phần tử html?

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

và bản đồ đó để các thuộc tính của một yếu tố html:

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

EDIT:

cách sạch đạt được ở trên là gì? Tôi chắc chắn rằng tôi có thể cobble một cái gì đó cùng với một vòng lặp và một số nối nhưng tôi nhận được cảm giác printf hoặc tương tự có thể làm điều đó một cách thanh lịch hơn.

+0

Vậy câu hỏi là gì? –

+0

Vì vậy, nếu bạn đã xây dựng một lớp học như vậy, bạn có thể đã thử một cái gì đó? Và những gì @nostrzak nói;) – dbf

+0

Tôi không hiểu, vấn đề ở đâu, hoặc bạn muốn làm gì:] –

Trả lời

17

Tôi nghĩ rằng điều này sẽ làm điều đó:

$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))).' />'; 
+0

Ngoài ra, tôi muốn lưu ý rằng các giá trị thuộc tính phải được thoát trước khi xuất nếu chúng được lấy từ nguồn không tin cậy (tức là đầu vào của người dùng). – e1v

3

cái gì đó dọc những dòng này (một phương pháp rất đơn giản - tất nhiên bạn có thể mở rộng này, nhưng điều này sẽ cung cấp cho bạn các chức năng cơ bản):

$output = "<input "; 
foreach($attributes as $key => $value){ 
    $output .= $key.'="'.$value.'" '; 
} 
$output .= "/>"; 
+0

Tôi đã gửi một bản chỉnh sửa bổ sung hỗ trợ cho các phần tử boolean như câu hỏi của anh ấy. – Robadob

+0

Cảm ơn, yếu tố boolean là mối quan tâm đặc biệt. – hamishtaplin

+0

Tùy thuộc vào loại HTML bạn muốn, có thể không cần phải có boolean. HTML5 giống như ví dụ của bạn, XHTML tuy nhiên phải là 'required =" required "'. –

3
$output = '<input '; 

foreach ($attributes as $name => $value) { 
    if (is_bool($value)) { 
     if ($value) $output .= $name . ' '; 
    } else { 
     $output .= sprintf('%s="%s"', $name, $value); 
    } 
} 

$output .= '>'; 

Đối với XHTML thay đổi

if ($value) $output .= $name . ' '; 

để

if ($value) $output .= sprintf('%s="%s"', $name, $name); 

$output .= '>'; 

để

$output .= '/>'; 
4
$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 
)) .' />'; 
+0

Vì vậy, nhiều giải pháp làm việc một nửa, rất nhiều di chuyển xuống ... Cảm ơn cuối cùng! – DomQ

0

Cũ học PHP 4-5,2 phiên bản. Điều này cũng cho phép một mảng cho thuộc tính class.

$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); 
} 
2

Như http_build_query có nghĩa là cho stringify kết hợp mảng, tôi hy vọng có thể vấp ngã khi một giải pháp như vậy ở đây. Không tìm thấy một, vì vậy đây là của tôi 'one-liner':

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

Thật không may:

  1. nó chuyển đổi boolean-giá trị đến 1/0 (thay vì ommiting họ nếu sai, có thể đạt được bằng cách sử dụng array_filter, nhưng kết quả trong các cuộc gọi hàm kép);
  2. không xử lý mảng theo cách mong muốn;
  3. Cần urldecode sau http_build_query để lấy lại không gian được mã hóa (ví dụ: khi có nhiều lớp html trong một thuộc tính).

Vì vậy, chỉ phù hợp trong một số trường hợp nhất định!

0

Đây là một giải pháp tôi sử dụng trong các dự án của tôi:

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

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

    return rtrim(vsprintf($compiled, array_map('htmlspecialchars', array_values($attributes)))); 
} 
0

tôi sử dụng cái này:

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

Cái này cho phép sử dụng mảng các giá trị thuộc tính của. Ví dụ

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

echo html_attributes($attrs); 
// -> `class="foo bar" id="baz"` 

'hy vọng nó sẽ giúp ai đó! ;-)

Các vấn đề liên quan