45式::雑記
45式::雑記は、日々の事を記してないから日記ではなく雑記です。

文字列の比較

コメント
0件
トラックバック
1件

実感なき文字列の比較

文字列の比較は知らない内に使っています。
例えばMTEntriesタグのsort_byモディファイアで名前順にソートした時、内部では文字列の比較が行われています。

同じsort_byモディファイアを持つMTLoopタグで確認してみましょう。

<MTSetHashVar name="monat">
    <$MTSetVar name="01" value="Januar"$>
    <$MTSetVar name="02" value="Februar"$>
    <$MTSetVar name="03" value="Maerz"$>
    <$MTSetVar name="04" value="April"$>
    <$MTSetVar name="05" value="Mai"$>
    <$MTSetVar name="06" value="Juni"$>
    <$MTSetVar name="07" value="Juli"$>
    <$MTSetVar name="08" value="August"$>
    <$MTSetVar name="09" value="September"$>
    <$MTSetVar name="10" value="Oktober"$>
    <$MTSetVar name="11" value="November"$>
    <$MTSetVar name="12" value="Dezember"$>
</MTSetHashVar>

<MTLoop name="monat" sort_by="value">
    <$MTGetVar name="__value__"$>
</MTLoop>

上記のコードを実行した結果が下になります。

    April
    August
    Dezember
    Februar
    Januar
    Juli
    Juni
    Maerz
    Mai
    November
    Oktober
    September

AprilからSeptemberまで順に並んで出力されました。

さらに、英字以外も取り混ぜた場合も試してみましょう。

<MTSetHashVar name="chara">
    <$MTSetVar name="01" value="1"$>
    <$MTSetVar name="02" value="a"$>
    <$MTSetVar name="03" value="A"$>
    <$MTSetVar name="04" value="あ"$>
    <$MTSetVar name="05" value="ア"$>
    <$MTSetVar name="06" value="9"$>
    <$MTSetVar name="07" value="z"$>
    <$MTSetVar name="08" value="Z"$>
    <$MTSetVar name="09" value="ん"$>
    <$MTSetVar name="10" value="ン"$>
    <$MTSetVar name="11" value="0"$>
    <$MTSetVar name="12" value="式"$>
</MTSetHashVar>

<MTLoop name="chara" sort_by="value">
    <$MTGetVar name="__value__"$>
</MTLoop>

(やらしい感じがしなくもない)実行結果。

    0
    1
    9
    A
    Z
    a
    z
    あ
    ん
    ア
    ン
    式

数字、大文字、小文字、ひらがな、カタカナ、漢字という順になりました。

並べ替えられた結果では文字列の比較がどうも実感できません。
そこで今度は個別の比較をして見ましょう。

個別の比較

比較にはMTIfタグの比較モディファイアを使います。
MTIfタグでは数値の比較だけでなく、文字列の比較もできます。

例として、aとzを比較してみます。

<$MTSetVar name="foo" value="a"$>
<$MTSetVar name="bar" value="z"$>

<MTIf name="foo" lt="$bar">
    <$MTGetVar name="foo"$> &lt; <$MTGetVar name="bar"$>
<MTElse name="bar" lt="$foo">
    <$MTGetVar name="bar"$> &lt; <$MTGetVar name="foo"$>
</MTIf>

実行結果です。

    a < z

先ほどのごちゃ混ぜの結果を不等式で表すと次のようになります。

0 < 1 < 9 < A < Z < a < z < あ < ん < ア < ン < 式

この式から実行結果が正しい事がわかります。
そしてこれは、文字列の比較ができた事を意味しています。

空白に注意

文字列の比較では空白に注意して下さい。

下は、記事冒頭の例を、変数の文字数が揃うように空白を挿入したものです。

<MTSetHashVar name="monat">
    <$MTSetVar name="01" value="   Januar"$>
    <$MTSetVar name="02" value="  Februar"$>
    <$MTSetVar name="03" value="    Maerz"$>
    <$MTSetVar name="04" value="    April"$>
    <$MTSetVar name="05" value="      Mai"$>
    <$MTSetVar name="06" value="     Juni"$>
    <$MTSetVar name="07" value="     Juli"$>
    <$MTSetVar name="08" value="   August"$>
    <$MTSetVar name="09" value="September"$>
    <$MTSetVar name="10" value="  Oktober"$>
    <$MTSetVar name="11" value=" November"$>
    <$MTSetVar name="12" value=" Dezember"$>
</MTSetHashVar>

<MTLoop name="monat" sort_by="value">
    <$MTGetVar name="__value__"$>
</MTLoop>

実行結果は空白を挿入する前と異なったものになります。

          Mai
         Juli
         Juni
        April
        Maerz
       August
       Januar
      Februar
      Oktober
     Dezember
     November
    September

AprilからSeptemberだった順が、今度はMaiからSeptemberになりました。

コメント[0]

コメントはまだありません。

コメント投稿フォーム

コメントを投稿するにはJavaScirptが必要です。ブラウザのJavaScriptを有効にしてください。

コメント投稿フォーム

トラックバック[1]

MTタグで日時を比較する方法とMTDateタグとtsモディファイア - 45式::雑記 (2010年6月15日02:22)
MTタグで日時を比較するには比較が可能な条件を満たす必要があります。 その条件を満たすのにはMTDateタグとtsモディファイアが便利です。
カテゴリ
アーカイブ
ヘルプ
Feed

フィードとは