Hi Udo
Wie Dr.Death schrieb, das
|length ist eine Absicherung.
Man kann darauf verzichten, wenn man das Array selber generiert und alle möglichen Zustände der Array Variable kennt und somit sicher sein kann, dass es auch ohne Absicherung geht. Verarbeitet man jedoch ein fremdes Array, schadet es definitiv nicht, das zusätzlich abzusichern, alleine weil eine goldene Regel beim Programmieren lautet: "Vertraue niemals Benutzereingaben!". Und damit sind auch generell
fremde Daten gemeint, egal aus welcher Quelle.
Wobei auch
|length nicht wasserdicht ist, denn wenn die Variable kein Array sondern einen String mit dem Inhalt "test" enthalten würde, dann würde die Absicherung ebenfalls (und in dem Fall fälschlicherweise)
true liefern, weil das bei Arrays die Anzahl der Elemente liefert, aber bei einem String die Anzahl Bytes. Und sobald das 1 oder höher zurückgibt, wird das implizit als
true gewertet.
Code: Alles auswählen
{% set test = [
'Apfel',
'Kiwi',
] %}
{{ test|length ? 'true' : 'false' }} ({{ test|length }})<br>
{% set test = 'Brot' %}
{{ test|length ? 'true' : 'false' }} ({{ test|length }})<br>
Ergebnis:
Relevant sind die Explizit/Implizit Regeln bei PHP bezüglich Bool Umwandlung:
https://www.php.net/manual/de/language. ... an.casting
Eine implizite Abfrage auf
true bei einem Array reicht dann aus, wenn sichergestellt ist, dass die Variable
immer ein Array enthält, egal ob ein leeres Array oder ein bestücktes Array.