टहनी से सरणी का तत्व निर्धारित करना


126

मैं ट्विग से पहले से मौजूद सरणी का सदस्य कैसे सेट कर सकता हूं?

मैंने इसे अगले तरीके से करने की कोशिश की:

{% set arr['element'] = 'value' %}

लेकिन मुझे निम्नलिखित त्रुटि मिली:

मूल्य में अप्रत्याशित टोकन "विराम चिह्न" ["(" बयान ब्लॉक का अंत "अपेक्षित) में ...

जवाबों:


211

ट्विग में ऐसा करने का कोई अच्छा तरीका नहीं है। हालांकि, यह मर्ज फिल्टर का उपयोग करके संभव है:

{% set arr = arr|merge({'element': 'value'}) %}

"।" - कथन "[]" के समान है, इसलिए इसका समाधान नहीं है
बाजी

@falinsky तुम सही हो। .और []ट्विग में बहुत समान हैं और मैं गलत था। मैंने इसे देखा और अपना उत्तर संपादित किया।
पॉल

17
मैं के प्रतिस्थापन में गतिशील चर कुंजी को परिभाषित करने के लिए एक रास्ता तलाश रहा था 'element'। मुझे नीचे @ LivaX का उत्तर मिला। तो, यह होगा {% set arr = arr|merge({(key): 'value'}) %}
सिथू

यह तो मूर्खतापूर्ण है। क्यों टहनी सरणी मूल्यों को सेट करने की क्षमता नहीं देता है?
मैट कैवानघ

1
@MattCavanagh क्योंकि दृश्य फ़ाइलें (जैसे टहनी) में व्यावसायिक तर्क शामिल नहीं हैं, यह अंततः मॉडल में संभाला जाना चाहिए। दृश्य वास्तव में बस वहाँ क्या प्रस्तुत करना चाहिए माना जाता है। हालाँकि, मेरे मामले में यह मुद्दा और मैं आपसे सहमत क्यों हूँ, यह है कि मैं यूआई ऑब्जेक्ट्स को रेंडर करने के लिए ट्विग मैक्रोज़ बनाता हूं, जैसे। {{ UI.button({'type':'submit'}) }}और इन सभी मैक्रो का उपयोग करें। डिफ़ॉल्ट
पैरामेट्स की

80

मैं इस समस्या में भाग गया, लेकिन 'एलीमेंट' जैसे साहचर्य सूचकांक के बजाय पूर्णांक इंडेक्स बनाने की कोशिश कर रहा था।

आपको ()मर्ज फ़िल्टर का उपयोग करने के साथ अपनी इंडेक्स कुंजी को सुरक्षित रखने की आवश्यकता है :

{% set arr = arr|merge({ (loop.index0): 'value'}) %} 

अब आप कस्टम इंडेक्स की जैसे जोड़ सकते हैं ('element'~loop.index0)


यह वास्तविक समाधान है जब आप गतिशील रूप से चाबियाँ डालने की कोशिश करते हैं, धन्यवाद LivaX!
निकोलसियस

19

यदि इनिशियलाइज़ेशन केवल आवश्यकता है:

{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}

9
यह सवाल नहीं था।
रेडिनार्ड

2

मैंने @LivaX का उत्तर देने की कोशिश की है, लेकिन यह काम नहीं करता है, एक सरणी को मर्ज करना जहाँ कुंजियाँ संख्यात्मक अभ्यस्त कार्य हैं ( https://github.com/twigphp/Twig/issues/789 )।

यह तभी काम करेगा, जब चाबियाँ स्ट्रिंग्स होंगी

मैंने जो किया वह tempप्रारंभिक तालिका से एक और तालिका ( ) को फिर से बनाया है और tकुंजी को एक स्ट्रिंग बनाएं, उदाहरण के लिए:

{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}

t कुंजियाँ: 0, 1, 2 ।।

temp कुंजियाँ: 0_, 1_, 2_ ...।


एक ही मुद्दा, अब तक कोई समाधान नहीं।
TyrionGraphiste 10

2
{% set links = {} %}

{# Use our array to wrap up our links. #}
{% for item in items %}
  {% set links = links|merge({ (loop.index0) : {'url': item.content['#url'].getUri(), 'text': item.content['#title']} }) %}
{% endfor %}

{%
set linkList = {
  'title': label,
  'links': links
}
%}

{% include '<to twig file>/link-list.twig'%}

इस धागे के लिए धन्यवाद - मैं भी (loop.index0) के साथ एक सरणी बनाने और टहनी भेजने में सक्षम था।


1

मैंने इस मुद्दे को बहुत कष्टप्रद पाया है, और मेरा समाधान शायद रूढ़िवादी है और ट्विग दर्शन के साथ इनलाइन नहीं है, लेकिन मैंने इसे विकसित किया है:

$function = new Twig_Function('set_element', function ($data, $key, $value) {
    // Assign value to $data[$key]
    if (!is_array($data)) {
        return $data;
    }
    $data[$key] = $value;
    return $data;
});
$twig->addFunction($function);

जिसका उपयोग निम्नानुसार किया जा सकता है:

{% set arrest = set_element (गिरफ्तारी, 'तत्व', 'मूल्य')%}


1

बस इस तरह का उपयोग करें {% set arr={'key':'value'} %}(के बाद कोई रिक्त स्थान नहीं है :), यह अच्छी तरह से काम करता है।

लेकिन जब मैं इसे लूप के लिए उपयोग करता हूं, तो इसे एक सरणी बनाने के लिए, यह कार्यक्षेत्र के बाहर काम नहीं करता है।

{% for group in user.groups %}
  {% set foo={'loop.index0':'group.id'} %}
  {% set title={'loop.index0':'group.title'} %}
  {{ title }} //it work 
{% else %}
  {% set foo={'0':'-1'} %}
  {% set title={'0':'未分组'} %}
{% endfor %}
{{ title }}  //it does not work, saying title is not defined

1
यदि आप लूप के लिए बाहर के चर का उपयोग करना चाहते हैं, तो आपको इसे लूप के बाहर परिभाषित करने की आवश्यकता है, यहां देखें: twig.sensiolabs.org/doc/tags/set.html
user2019515

5
यह हर तरह का गलत है। बृहदान्त्र के बाद की जगह कोई फर्क नहीं पड़ता। आप नए ऐरे बना रहे हैं, एरे में एक तत्व सेट नहीं कर रहे हैं जो प्रश्न था। आप {{array}} जैसे किसी सरणी को आउटपुट नहीं कर सकते, जो एक त्रुटि उत्पन्न करेगा। यह उत्तर असफलता से भरा है और पूछे गए प्रश्न से असंबंधित है।
रेडिनार्ड

3
मुझे समझ में नहीं आता है कि यह ऊपर क्यों होता है, जैसा कि ऊपर कहा गया है, इस "उत्तर" में लगभग सब कुछ गलत है ...
MariusJP

0

मेरे पास एक बहु आयाम सरणी थी। एकमात्र समाधान जो मुझे पता चला कि एक नया अस्थायी सरणी बना सकता है और जानकारी को अपडेट / जोड़ सकता है, जिसे आगे किसी अन्य टहनी समारोह में पारित किया गया था।


0

मुझे कुछ समय पहले यह समस्या थी। कल्पना कीजिए कि आपके पास इस तरह की एक सरणी है:

data = {
    'user': 'admin',
    'password': 'admin1234',
    'role': 'admin',
    'group': 'root',
    'profile': 'admin',
    'control': 'all',
    'level': 1,
    'session': '#DFSFASADASD02',
    'pre_oa': 'PRE-OA',
    'hepa_oa': 'HEPA-OA',
    'pre_ra': 'HEPA-RA',
    'hepa_ra': 'HEPA-RA',
    'deodor_ra': 'DEODOR-RA'
}

इसलिए, आप इस डेटा को दो पंक्तियों में दिखाना चाहते हैं, लेकिन उस सूची से पासवर्ड हटा दें। इसके लिए, sliceफ़िल्टर के साथ 2 सरणियों में विभाजन आसान होगा । हालाँकि, हमें पासवर्ड निकालना होगा। उस कारण से, मैं इस स्निपेट का उपयोग कर रहा हूं। विचार सभी तत्वों dataको 2 से विभाजित तत्वों के आकार से कम रखना है। इसकी गणना करने के लिए हम फिल्टर का उपयोग करते हैं length। अब वर्तमान तत्व का सूचकांक प्राप्त करने के लिए हम उपयोगकर्ता loop.index। और अंत में हम बाएं या दाएं सरणी में एक सहयोगी तत्व को धक्का देते हैं। एक सहयोगी सरणी में दो घटक होते हैं keyऔर value। हम ऑपरेटर से जुड़वा में एक सरणी कुंजी को संदर्भित करने के लिए ()और हम mergeयहां दिखाए गए अनुसार फ़िल्टर को सरणी में धकेलने के लिए उपयोग करते हैं{% set left_list = left_list|merge({ (key): value }) %}

यह पूरा उपाय है।

{% set left_list = {} %}
{% set right_list = {} %}
{% set limit = data|length // 2 %}
{% for key, value in data|cast_to_array %}
{% if key != 'password' %}
{% if loop.index <= limit %}
{% set left_list = left_list|merge({ (key): value }) %}
{% else %}
{% set right_list = right_list|merge({ (key): value }) %}
{% endif %}
{% endif %}
{% endfor %}
{% for key, value in left_list %}
<p>
<label for="{{key}}">{{key}}</label>
<input type="text" name="{{key}}" id="{{key}}" value="{{value}}"
       class="text ui-widget-content ui-corner-all">
</p>
{% endfor %}

0

आप निम्न सिंटैक्स का भी उपयोग कर सकते हैं:

{% set myArray = myArray + myArray2 %}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.