0

这一定很简单,但我似乎无法让它工作。我的代码:

// a, b, c are true or false
$arr = array($a, $b, $c);
foreach ($arr as $value) {
    if ($value == "false") {
        $value = 0;
    }
    elseif ($value == "true") {
        $value = 1;
    }
}

// Now I want $a to be either 0 or 1. Right now $value is 0 or 1.
echo $a; -> true/false
echo $value; -> 0/1

那么我怎样才能使 $a 0/1 和下一次 $b 0/1 等呢?

4

4 回答 4

2

尝试这个:

// Callback function, pass reference to item in array
function callback(&$val)
{
    // If $val is true, make it 1, else make it 0
    $val = $val ? 1 : 0;
}

$array = array(true, true, false);

array_walk($array, 'callback');

print_r($array);
// Output: Array ( [0] => 1 [1] => 1 [2] => 0 )
于 2013-08-24T13:08:07.390 回答
1

正如评论中提到的,我不清楚为什么您希望代码以相同的方式对多个变量进行操作,而不能简单地将它们视为(关联)值数组。

因此,我不建议将此代码作为任何人使用的模式。但是,您正在寻找的可以使用references来实现。在 PHP 中通过引用赋值意味着让两个变量指向同一个东西——一个不是对另一个的引用它们都是对一块未命名的内存的引用。

在您的情况下,您需要这样做两次:首先,当您将单独的变量放入临时数组时,您希望该数组包含对这些相同变量的引用,而不仅仅是它们的值。其次,foreach(or array_walk, etc) 也将从数组中获取,除非您使用适当的语法通过引用显式分配。

因此,在原始代码中的适当位置撒上&,你会得到:

$a = 'true';
$b = 'false';
$c = 'true';

// $a, $b, $c are strings containing 'true' or 'false'

// Step 1: make an array whose elements are joined as references to $a, $b, $c
$arr = array(&$a, &$b, &$c);

// Step 2: loop over the array, taking a reference to each of its elements, not just the values
foreach ($arr as &$value) {
    if ($value == "false") {
        $value = 0;
    }
    elseif ($value == "true") {
        $value = 1;
    }
}
// Step 2b: after looping by reference, $value will still refer to one of the variables in the array
// this is often a cause of bugs later, so unsetting it is a good habit
unset($value);

// Did it work?
echo "A: $a; B: $b; C: $c";

这是一个现场演示,显示输出为“A:1;B:0;C:1”。

再说一遍,在我看来,像这样大量使用引用通常不是一个好的编码模式,因为它使代码难以遵循和调试。

于 2013-08-24T13:18:07.690 回答
1
$arr = array_map('intval', array($a, $b, $c));

然后 $arr 将包含 $a、$b 和 $c 的整数值。

于 2013-08-24T12:51:47.987 回答
0

Foreach 循环可以使用您的键/值作为参考:

$arr = array($a, $b, $c);
foreach ($arr as &$value) {
    $value = ($value == "true") ? 1 : 0;
}
于 2013-08-24T13:17:36.440 回答