2013-08-06 6 views
10

मैं थोड़ा मेरे कार्यप्रवाह में तेजी लाने के एक बुनियादी रूप इमारत वर्ग का निर्माण कर रहा हूँ और मैं इतना जैसी विशेषताओं की एक सरणी लेने में सक्षम होना चाहते हैं:मैं HTML तत्व विशेषताओं में एक सहयोगी सरणी को कैसे मैप कर सकता हूं?

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

और एक की विशेषताओं के लिए नक्शे है कि HTML तत्व:

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

संपादित करें:

ऊपर प्राप्त करने का साफ तरीका क्या है? मुझे यकीन है कि मैं एक लूप और कुछ कॉन्सटेनेशन के साथ कुछ इकट्ठा कर सकता हूं लेकिन मुझे लगता है कि प्रिंटफैफ़ महसूस हो रहा है या इसी तरह इसे और अधिक सुरुचिपूर्ण ढंग से कर सकता है। इन पंक्तियों के साथ

+0

तो सवाल क्या है? –

+0

तो यदि आपने ऐसी कक्षा बनाई है, तो शायद आपने कुछ कोशिश की है? और क्या @nostrzak ने कहा;) – dbf

+0

मुझे यह नहीं मिला, समस्या कहां है, या वास्तव में आप क्या करना चाहते हैं:] –

उत्तर

17

मुझे लगता है कि यह यह करना चाहिए:

$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

मैं यह भी देखना चाहता हूं कि आउटपुट मानों को आउटपुट करने से पहले बचाना चाहिए यदि उन्हें अविश्वसनीय स्रोत (यानी उपयोगकर्ता इनपुट) से लिया जाता है। – e1v

3

कुछ (एक बहुत ही सरल विधि - निश्चित रूप से आप इस विस्तार कर सकते हैं, लेकिन यह बुनियादी कार्यक्षमता प्रदान करेगा):

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

मैंने एक संपादन सबमिट किया है जो बूलियन तत्वों के लिए समर्थन जोड़ता है क्योंकि उसका प्रश्न प्रदर्शित करता है। – Robadob

+0

धन्यवाद, बुलियन तत्व विशेष रुचि का है। – hamishtaplin

+0

आप जिस HTML को चाहते हैं उसके आधार पर, बूलियन की आवश्यकता नहीं हो सकती है। एचटीएमएल 5 आपके उदाहरण की तरह है, एक्सएचटीएमएल हालांकि आवश्यक "आवश्यक =" होना चाहिए। –

3
$output = '<input '; 

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

$output .= '>'; 

एक्सएचटीएमएल बदलाव के लिए

if ($value) $output .= $name . ' '; 
संस्करण 5.2 -

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

इतने सारे आधे कामकाजी समाधान, बहुत नीचे स्क्रॉलिंग ... आखिरकार धन्यवाद! – DomQ

0

पुराने स्कूल PHP 4। यह 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

http_build_query के रूप में करने के लिए है stringify साहचर्य सरणी के, मैं यहाँ इस तरह के एक समाधान पर ठोकर करने के लिए आशा व्यक्त की।

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

दुर्भाग्य:

  1. यह बूलियन मान 1/0 करने के लिए (बजाय अगर झूठी उन्हें ommiting की बदल देता है, हो सकता है जो एक भी नहीं मिला है, तो यहाँ मेरी 'एक लाइनर' है array_filter का उपयोग करके हासिल किया गया, लेकिन परिणामस्वरूप डबल फ़ंक्शन-कॉल);
  2. सरणी को वांछित तरीके से संभाल नहीं करता है;
  3. http_build_query के बाद एन्कोडेड रिक्त स्थान वापस पाने के लिए आवश्यक है (उदाहरण के लिए, जब किसी विशेषता में एकाधिक HTML-Classing हों)।

तो, कुछ स्थितियों में केवल उपयुक्त!

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

यह एक विशेषता के मूल्य की सरणी उपयोग करने की अनुमति:

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

यह एक समाधान मैं अपनी परियोजनाओं में इस्तेमाल करते हैं। पूर्व।

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

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

'उम्मीद है कि यह किसी की मदद करेगी! ;-)

0

मैं इस एक का उपयोग करें:

संबंधित मुद्दे

 संबंधित मुद्दे