获取字符串的数字权重,以便稍后使用PHP按字母顺序排序

获取字符串的数字权重,以便稍后使用PHP按字母顺序排序,php,drupal,Php,Drupal,我需要得到一个字符串的数字权重,这将在后面的代码中用于在页面呈现期间按字母顺序排序 我需要得到我正在使用字符串的实例的重量。字符串在数组中不可用,并且此时没有可用的字符串列表 我试图使用字符串的ASCII码,但这不能正常工作 用例 我正在用Drupal创建表单。表单项有一个权重元素,可用于对项进行排序 对于每个表单项,我都有一个从对象(来自数据库)获得的字符串名称。我想从这个字符串中获得权重,这样当呈现表单时,表单项将按字母顺序显示 示例代码 这是我用来构建Drupal表单项的代码片段: <

我需要得到一个字符串的数字权重,这将在后面的代码中用于在页面呈现期间按字母顺序排序

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

我试图使用字符串的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>',
    );
?>

您可以基于
字符串
值生成权重,方法是循环通过
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);
}
/$amount:给定文本循环的字符数
//$start_-weight:起始权重值越低,优先级越高
函数get_weight_from_name($text,$amount=4,$start_weight=-30)
{
$weight=$start\u weight;
对于($i=0;$i<$amount;++$i){
$weight+=(ord(substr(strtolower($text),$i))-97/(intval(sprintf('1%s',stru repeat(0,$i)));
}
返回轮(重量2美元);
}

使用DB存储表单,然后在渲染表单时,按字符串的升序/降序向后拉。

我想到了以下方法:

<?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));
?>


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

为什么它必须是字符串?为什么不直接使用int呢?@gordon我不知道你说的这个aproachI是什么意思。我已经尝试过类似的方法,你的除法器使它更精确,但还是有点不太准确。首先,字符串可以包含数字和符号(假设我可以用正则表达式修复)。其次,以“aq…”开头的字符串仍然比“Big…”重。刚刚检查的
aq
(-28.4)和
Big
(-28.2)的重量似乎是正确的。值越低,优先级越高
aq
位于
Big
之前。表单是根据输入变量动态生成的,可以有很多。