我正在尝试添加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;
}
答案 0 :(得分:4)
好吧,第一个$twitCnt
是一个格式化的字符串(我不知道你为什么要将值直接格式化为变量,因为你需要在显示它之前计算该值,你应该只格式化它 显示时)。 $feedCnt
是SimpleXMLElement
类型的对象。
要解决此问题,请不要格式化$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;