好的,我测试了以下内容,我会让你知道我发现了什么:
echo ('-1' < 0) ? 'true' : 'false'; // will echo "true"
echo ('1' > 0) ? 'true' : 'false'; // will echo "true"
# Notice that '-1' and '1' are strings
现在让我们在过滤所有结果后从数据库中获取一个数组,以便只获取UID = 1
的行。
$this->a = array(
[0] => array(
'UID' => '1',
'PID' => '91',
'Amount' => '-1'
),
[1] => array(
'UID' => '1',
'PID' => '92',
'Amount' => '1'
),
[2] => array(
'UID' => '1',
'PID' => '93',
'Amount' => '1'
)
);
现在我想创建一个函数posAmount($PID)
,如果true
则返回'Amount' > 0
,false
时返回'Amount' < 0
。 (注意:金额= 0是我真的不在乎的事情)。另外,我想写一个名为negAmount($PID)
的类似函数,它返回与第一个函数完全相反的函数。我现在想向您介绍我的双重功能:
public function posAmount($pid)
{
foreach ($this->a as $a)
{
if (count($this->a) == 0) { return false; }
return ($a['PID'] == $pid and $a['Amount'] > 0) ? true : false;
}
}
public function negAmount($pid)
{
foreach ($this->a as $a)
{
if (count($this->a) == 0) { return false; }
return ($a['PID'] == $pid and $a['Amount'] < 0) ? true : false;
}
}
很酷的事实是,关于第一个数组(我用var_dump()
检查过,它通过整个脚本保持其性质):
$istance->negAmount(91); // Returns true, as expected
$istance->posAmount(92); // Returns false, as NOT expected.
# Why do God wants me to get mad?
答案 0 :(得分:5)
问题是你总是在foreach循环的第一次迭代中返回。你应该重写这样的函数:
public function negAmount($pid) {
if (count($this->a) == 0) { return false; }
foreach ($this->a as $a) {
if ($a['PID'] == $pid) {
if ($a['Amount'] < 0) {
return true;
}
}
}
return false;
}
public function posAmount($pid) {
if (count($this->a) == 0) { return false; }
foreach ($this->a as $a) {
if ($a['PID'] == $pid) {
if ($a['Amount'] > 0) {
return true;
}
}
}
return false;
}
答案 1 :(得分:2)
可能只是您的演示代码中的拼写错误,但 - OP已更正posAmount
方法正在循环$this->a
,而另一种方法是循环$this->votes
你的代码中有一些奇怪的东西。为什么要在$this->a
循环中检查foreach
的计数?在开始循环之前检查计数会更有意义。
此外,您在比较中遇到了一些逻辑错误。您只是将第一次迭代与循环进行比较...它将为数组的第一个索引返回true或false,甚至不会查看其他索引。在比较 - 并返回 - 任何事情之前,您将希望在循环中匹配PID。像这样:
public function posAmount($pid)
{
if (count($this->a) == 0) { return false; }
foreach ($this->votes as $a) {
if ($a['PID'] == $pid)
return $a['Amount'] > 0 ? true : false;
}
return false;
}
public function posAmount($pid)
{
if (count($this->a) == 0) { return false; }
foreach ($this->votes as $a) {
if ($a['PID'] == $pid)
return $a['Amount'] < 0 ? true : false;
}
return false;
}
答案 2 :(得分:0)
问题是你试图将字符串与int进行比较而不尝试转换它。将$a['Amount']
更改为(int)$a['Amount']
,看看会发生什么。
答案 3 :(得分:0)
所以在这里你迭代$ this-&gt; a:
public function posAmount($pid)
{
foreach ($this->a as $a)
但是这里$ this-&gt;投票:
public function posAmount($pid)
{
foreach ($this->a as $a)
错字或什么......