0

我需要获取字符串的数字权重,稍后将在代码中用于在页面呈现期间按字母顺序排序。

我需要获得我正在使用字符串的实例的权重。字符串在数组中不可用,并且此时没有可用的字符串列表。

我尝试使用字符串的 ASCII 码,但这不能正常工作。

用例

我正在使用 Drupal 创建表单。表单项有一个权重元素,可用于对项进行排序。

对于每个表单项,我都有一个从对象(来自数据库)中获取的字符串名称。我想从这个字符串中获取权重,以便在呈现表单时,表单项将按字母顺序显示。

示例代码

这是我用来构建 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一定数量的字符并检索字母的 ASCII 值减去 97(字母a需要从 开始)来生成基于值的权重0。每个字母的值需要从一个起始权重中推导出来,其中第一个字母的重要性高于第二个字母,所以一个...

这是一个可以帮助您的示例函数:

// $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

使用数据库存储表单,然后在渲染它时,以字符串的升序/降序拉回。

于 2013-10-25T00:05:19.203 回答
0

我想出了这个:

<?php
$weight_string = preg_replace("/[^0-9a-zA-Z]/", "", $string);
$weight = 0;
$weight += ord(substr(strtolower($weight_string), 0)) * 1000;
$weight += ord(substr(strtolower($weight_string), 1)) * 10;
$weight += ord(substr(strtolower($weight_string), 2));
?>

注意第一个乘数,这是解决它的关键。

于 2013-10-25T08:02:12.953 回答