Nasıl "add" do

3 Cevap php

Ne yazık ki, bazı dize manipülasyon yapar (c / c + +), bazı kod devralınan ve şimdi üzerinde bu işlevi internets üzerinden ulaşılabilir böylece php o / port kopyalamanız gerekir.

Özellikle işlevselliği bazı keyfi dizeleri alır ve bunları birbirine ekler "". (C kod karakter dizisine aşağı dolaşır ve sonra bazı olduklarından emin alfanümerik aralığında olduğundan emin olmak için kontrol yapar)

(Ben bir PHP geliştiricisi değilim) bu nasıl belirli kod örneklerini bulamıyorum - Herkes bu açıklayacağım bazı kaynaklara beni işaret edebilir? (Temelde string / karakter dizisi manipülasyon yapmak için nasıl)

DÜZENLEME

In response to some comments and answers: I want the result in ascii, but essentially I will be adding base 36 numbers.

The C code right now converts to base 36 (from ascii) then "adds" each element together (does not carry - although the original author intended that - and it for some strange reason does the "add" from most significant to least) Then converts back to ascii. Strings can be of different lengths

Geçerli yanıtlara dayanarak i ne gerek yeterli olduğunu düşünüyorum. Bazen yeni bir dil öğrenmek her zaman sinir bozucu - Eğer ne istediğinizi tam olarak bilmek ve diğer dillerde yapabilirsiniz, eldeki görev için değil sadece biri ...

Şimdiye kadar yanıt için teşekkürler.

3 Cevap

Sadece base_convert () Onları değil miyim?

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

Yoksa keyfi hassas gerekiyor? Burada baz 36 keyfi hassas ek bir bıçak, var:

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;
}

Eğer php böyle bir dize varsa sadece bu yüzden gibi bireysel bir karakterin dizinini çağırabilirsiniz:

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

Yani diğer bir deyişle, $ string_var [n] size nth karakter, 0-endeksli verir.

Öncelikle, ben ascii değerleri eklemek istediğiniz varsayarak yaşıyorum.

ord() size yardımcı olabilir. Diğer cevap dayanarak, gibi bir şey:

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

Bu kullanıyorsanız, muhtemelen $ x ve $ y farklı uzunlukları ise bir şeyler yapmak isteyeceksiniz, ama karşısında fikir alır düşünüyorum.