PHP数组从true / false到0/1

时间:2013-08-24 12:50:55

标签: php arrays

这一定非常简单,但我似乎无法让它发挥作用。 我的代码:

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

那么我如何才能赚取$ 0/1,下一次$ b 0/1等?

4 个答案:

答案 0 :(得分: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 )

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

正如评论中所提到的,我不清楚为什么你会希望代码以多个变量运行,而不能简单地将它们视为(关联)值数组。

因此,我不建议将此代码作为任何人使用的模式。但是,您正在寻找的是使用 references 来实现的。在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";

Here is a live demo显示输出为“A:1; B:0; C:1”。

再次重复,在我看来,大量使用这样的引用通常是一种很好的编码模式,因为它会使代码难以理解和调试。

答案 3 :(得分:0)

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

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