Milk+ea

Weblog Is My Hobby.

【Liquid】何かで区切られている文字列をfor文で1つずつ取り出す

Liquidにハマってます(悪い意味で)。

こういうスペースで区切られている文字列を

{% assign array = 'foo bar baz' %}

下のような感じにしようと思ったんです。

<p>foo</p>
<p>bar</p>
<p>baz</p>

最初はスペースでsplitして配列にしたらいいんじゃとこんな風にやってましたがうまくいかない。

{% capture test %}{{ array | split: ' ' }}{% endcapture %}

これだと配列にした文字列をjoinした文字列になってしまうようです。
変数にsizeをすると文字列のサイズ。
続けてsizeをすると配列のサイズ。

'foobar'
{{ test | size }} #=> 9

# 下だと配列のサイズ 
{{ array | split: ' ' | size }} #=> 3

なので、サイズを取っておいてその分ループさせるようにしました。
毎回splitして先頭だけを取り出して、もとの変数からそれを削除するという面倒だけどこれしか思いつかなかったのです。

{% capture array_size %}{{ array | split: ' ' | size }}{% endcapture %}
{% for i in (1..array_size) %}
  # 先頭を取り出す
  {% capture string %}{{ array | split: ' ' | first }}{% endcapture %}
  <p>{{ string }}</p>

  # 削除する文字列(最後にスペースを足したもの)
  {% capture del_string %}{{ string }} {% endcapture %}

  # 表示させた文字を削除してarray変数を上書き
  {% capture array %}{{ array | remove: del_string }}{% endcapture %}

  # 1ループ終わった時点のarray 'bar baz'
{% endfor %}

とりあえずはこれでいいや。