数字在PHP中无法正确添加

时间:2012-02-08 02:23:54

标签: php

我正在尝试添加Twitter计数和Feedburner计数,但是当我将这两者与基本添加结合使用时,它会失败!如果我得到了valkues并打印出seperatley它工作正常,就不会让我加上两个......

$twitCnt = twitter_subscribers(TWITTER_USERNAME);
$feedCnt = feed_subscribers(FEEDBURNER_USERNAME);
$totalCnt = $twitCnt + $feedCnt;

echo $totalCnt;

假设$twitCnt = 2000且$feedCnt = 1000

现在当我尝试添加2而不是3000时,我会得到$feedCnt值+ 1 = 1001而不是3000

我目前感到难过,如果我打印$twitCnt并且$feedCnt他们显示正确的金额,但是当我在代码中添加2时,$twitCnt显示为= 1而不是它的实际值。

任何想法会导致什么?


运行var_dump($twitCnt, $feedCnt)

后更新
string(5) "3,000"
object(SimpleXMLElement)#238 (1) {
  [0]=>
  string(5) "1,000"
}

获取统计数据的功能......

function twitter_subscribers($username = 'yourname'){
    $count = get_transient('twitter_count');
    if ($count != false){
        return $count;
    }else{
        $count = 0;         
        $url = 'http://api.twitter.com/1/users/show.xml?screen_name='. $username;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        $data = curl_exec($ch);
        curl_close($ch);
        $xml = new SimpleXMLElement($data);
        $count = $xml->followers_count;
        $count = (float) $count;
        $count = number_format($count);
        set_transient('twitter_count', $count, 21600); // 6 hour cache
        return $count;
    }
}

function feed_subscribers($username = 'yourname')
{
    $feed_url = 'http://feeds.feedburner.com/' . $username;
    $count = get_transient('rss_count');
    if ($count != false)
        return $count;
    $count = 0;
    $data = wp_remote_get('http://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=' .
        $feed_url . '');
    if (is_wp_error($data)) {
        return 'error';
    } else {
        $body = wp_remote_retrieve_body($data);
        echo $body;
        $xml = new SimpleXMLElement($body);
        $status = $xml->attributes();
        if ($status == 'ok') {
            $count = $xml->feed->entry->attributes()->circulation;
        } else {
            $count = 300; // fallback number
        }
    }
    set_transient('rss_count', $count, 21600); // 6 hour cache//60*60*24

    return $count;
}

3 个答案:

答案 0 :(得分:4)

好吧,第一个$twitCnt是一个格式化的字符串(我不知道你为什么要将值直接格式化为变量,因为你需要在显示它之前计算该值,你应该只格式化它 显示时)。 $feedCntSimpleXMLElement类型的对象。

要解决此问题,请不要格式化$twitCnt,而只应在向用户显示值(即回显它)时进行格式化。并修复此行$count = $xml->feed->entry->attributes()->circulation;,使其返回数值而不是对象。

** 更新 **

我找了一小段代码here并将其作为解决方案将您的格式化数字转换为实际数值。

例如,它会将1,200.123转换为1200.123

function formattedStringToNumeric($str) {
  $a = array_pad(explode(".",str_replace(',','',$str)), 2, 0);            // Split the string, using the decimal point as separator
  $int = $a[0];                        // The section before the decimal point
  $dec = $a[1];                        // The section after the decimal point
  $lengthofnum=strlen($dec);            // Get the num of characters after the decimal point
  $divider="1";                        // This sets the divider at 1
  $i=0;
  while($i < ($lengthofnum)) {
    $divider.="0";                    // Adds a zero to the divider for every char after the decimal point
    $i++;
  }
  $divider=(int)$divider;                // Converts the divider (currently a string) to an integer
  return $int+($dec/$divider);        // compiles the total back as a numeric 
}

但是,为什么你只能这样做会变得复杂:

$value = (float) str_replace(',','',$string);

答案 1 :(得分:2)

问题在于:

$count = $xml->feed->entry->attributes()->circulation;

SimpleXMLElement::attributes返回一个SimpleXMLElement对象,获取其中一个属性也是如此,但您可以像在twitter函数中一样强制转换为预期的数据类型:

$count = $xml->followers_count;
$count = (float) $count;

因此,转换为整数,浮点数,甚至是字符串:

$count = (int) $xml->feed->entry->attributes()->circulation;

答案 2 :(得分:1)

确保变量是数字。

$totalCnt = (int)$twitCnt + (int)$feedCnt;