【问题标题】:How do I "add" strings in PHP - not concatenate, but "add" them. (as if each character was a base 36 numbers)如何在 PHP 中“添加”字符串 - 不是连接,而是“添加”它们。 (好像每个字符都是以 36 为基数的数字)
【发布时间】:2009-12-06 06:49:21
【问题描述】:

不幸的是,我继承了一些代码(c/c++)来进行一些字符串操作,现在我需要将其复制/移植到 php,以便可以通过 Internet 访问此功能。

具体来说,该功能采用一些任意字符串并将它们“添加”在一起。 (c 代码向下迭代字符数组,然后进行一些检查以确保它们在字母数字范围内)

我找不到有关如何执行此操作的具体代码示例(我不是 PHP 开发人员)- 谁能指出一些可以解释这一点的资源? (基本上如何进行字符串/字符数组操作)

编辑

针对一些cmets和答案: 我想要 ascii 中的结果,但本质上我将添加基数为 36 的数字。

C 代码现在转换为 base 36(来自 ascii) 然后将每个元素“添加”在一起(不携带-尽管原作者打算这样做-出于某种奇怪的原因,“添加”从最重要到最不重要) 然后转换回ascii。 字符串可以有不同的长度

根据当前的答案,我认为我有足够的需要。有时学习一门新语言总是令人沮丧——你确切地知道自己想要什么,而且你可以用其他语言做到这一点,只是不是手头任务的语言......

感谢到目前为止的回复。

【问题讨论】:

  • 这是两个基数为 36 的数字相加吗?问题不清楚。
  • 是的,这基本上就是我想做的。

标签: php arrays string


【解决方案1】:

你不能只base_convert() 他们吗?

$sum   = base_convert($str1, 36, 10) + base_convert($str2, 36, 10);
$sum36 = base_convert($sum, 10, 36);

或者您需要任意精度?这是一个以 36 为基数的任意精度加法:

function b36_add($str1, $str2)
{
    $to10 = array();
    for ($i = 0; $i < 36; ++$i)
    {
        $to10[base_convert($i, 10, 36)] = $i;
    }

    $len  = max(strlen($str1), strlen($str2));
    $str1 = str_repeat('0', $len - strlen($str1)) . $str1;
    $str2 = str_repeat('0', $len - strlen($str2)) . $str2;

    $pos   = $len - 1;
    $carry = 0;
    $sum   = '';

    do
    {
        $tmp    = base_convert($carry + $to10[$str1[$pos]] + $to10[$str2[$pos]], 10, 36);
        $sum   .= substr($tmp, -1);
        $carry  = (int) substr($tmp, 0, -1);
    }
    while (--$pos >= 0);

    $sum = strrev($sum);
    if ($carry)
    {
        $sum = base_convert($carry, 10, 36) . $sum;
    }
    return $sum;
}

【讨论】:

  • 这看起来对我有用。我对php不是很熟悉。谢谢
【解决方案2】:

如果你在 php 中有这样的字符串,你可以像这样调用单个字符的索引:

<?
  $x = "Hello";
  print $x[0] . "\n";

换句话说,$string_var[n] 给你第 n 个字符,0 索引。

【讨论】:

    【解决方案3】:

    首先,我假设您要添加 ascii 值。

    ord() 可能会对您有所帮助。根据另一个答案,类似:

    <?php
    function addStrings($x, $y){
      // Assumes that both strings are the same length
      for($i=0; $i<strlen($x); $i++){
        $result[i] = ord($x[i]) + ord($y[i]);
      }
      return $result;
    }
    ?>
    

    如果你使用这个,如果 $x 和 $y 的长度不同,你可能会想要做一些事情,但我认为它可以理解这个想法。

    【讨论】:

    • 是的,在 c 代码中它们被转换为 base 36,然后转换回 ascii。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多