从true/false到0/1的PHP数组


PHP array from true/false to 0/1

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

// 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等等。?

试试这个:

// 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 )

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

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

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

因此,将&放在原始代码中的适当位置,可以得到以下内容:

$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"。

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

$arr = array_map('intval', array($a, $b, $c));

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

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

$arr = array($a, $b, $c);
foreach ($arr as &$value) {
    $value = ($value == "true") ? 1 : 0;
}