0

ページのレンダリング中にアルファベット順にソートするためにコードで後で使用される文字列の数値の重みを取得する必要があります。

文字列で作業しているインスタンスの重みを取得する必要があります。文字列は配列で使用できず、その時点で使用できる文字列のリストはありません。

文字列の ASCII コードを使用しようとしましたが、正しく動作しません。

使用事例

Drupalでフォームを作っています。フォーム アイテムには、アイテムの並べ替えに使用できる weight 要素があります。

フォーム項目ごとに、オブジェクト (データベースから取得) から取得した文字列名があります。この文字列から重みを取得して、フォームがレンダリングされるときにフォーム項目がアルファベット順に表示されるようにします。

サンプルコード

これは、Drupal フォーム アイテムを作成するために使用するコードのスニペットです。

<?php
//string $team_name and int $team_id are available at this point.
//from $team_name, I want to determine a numeric weight here and put in $weight.
$form['team_' . $team_id] = array(
        '#type' => 'fieldset',
        '#title' => $team_name,
        '#collapsed' => FALSE,
        '#collapsible' => TRUE,
        '#weight' => $weight, //<<<<< Numeric weight to be inserted here.
        '#prefix' => '<div class="container-inline">',
        '#suffix' => '</div>',
    );
?>
4

3 に答える 3

1

string文字数をループしx、文字から 97 を引いた ASCII 値を取得することで、値に基づいて重みを生成できます(文字aは から開始する必要があります0)。各文字の値は、最初の文字が 2 番目の文字よりも重要度が高い開始重みから推測する必要があります。

これはあなたを助けることができる関数の例です:

// $amount: amount of characters to loop for a given text
// $start_weight: the starting weight, the lower the value, the higher the priority
function _get_weight_from_name($text, $amount = 4, $start_weight = -30)
{
    $weight = $start_weight;
    for ($i = 0; $i < $amount; ++$i) {
        $weight += (ord(substr(strtolower($text), $i)) - 97) / (intval(sprintf('1%s', str_repeat(0, $i))));
    }

    return round($weight, 2);
}
于 2013-10-24T22:02:38.107 に答える
1

DB を使用してフォームを保存し、それをレンダリングするときが来たら、文字列の昇順/降順で引き戻します。

于 2013-10-25T00:05:19.203 に答える