更改多维数组值

时间:2018-10-10 19:16:19

标签: php arrays

我有一个像这样的数组

$dataArray = array(
    array( 20800, 21679, 0 ),
    array( 15254, 0, 3726 ),
    array( 17426, 2973, 0 ),
    array( 4391, 37, 0 ),
    array( 39194, 435, 0 )
);

如果数组元素大于2000,我想给它一个值1。否则,我想给它一个值0。所以上面的数组应该变成

$dataArrayOutput = array(
    array( 1, 1, 0 ),
    array( 1, 0, 1 ),
    array( 1, 1, 0 ),
    array( 1, 0, 0 ),
    array( 1, 0, 0 )
);

实现此目标的最佳方法是什么?目前我正在尝试

foreach ($dataArray as $data) {
    foreach ($data as $key => $value) {
        if($value > 1999) {
            $value = 1;
        } else {
            $value = 0;
        }
    }
}

但是似乎没有什么改变。我该如何实现自己的追求?

谢谢

4 个答案:

答案 0 :(得分:2)

更多的娱乐价值,但仍然是可行的选择。使用array_walk_recursive()遍历数组结构,然后,如果该项是整数(is_int()),它将根据它是否大于1999进行设置。如果它不是整数,则仅保留数据。

array_walk_recursive($dataArray,  function (&$data) { 
            $data = (is_int($data))?(($data> 1999)?1:0):$data;    });

答案 1 :(得分:1)

您很近。您需要在&前面加上一个将内存地址传递给循环的地址,然后更新该值:

foreach ($dataArray as &$data) {
    foreach ($data as $key => &$value) {
        if($value > 1999) {
            $value = 1;
        } else {
            $value = 0;
        }
    }
}

您可以在此处了解有关pass by reference的更多信息:http://php.net/manual/en/language.references.pass.php

如果数组具有嵌套/不同级别,则可以使用如下递归函数:

function recursiveUpdateValue($item) {
    if(is_array($item)) {
        foreach($item as $k => $v) {
            $item[$k] = recursiveUpdateValue($v);
        }
        return $item;
    } else {
        return ($item >= 2000) ? 1 : 0;
    }
}

$updatedArray = recursiveUpdateValue($dataArray);

答案 2 :(得分:1)

foreach循环内的数组值通过值传递。您可以显式使用&通过引用传递值,也可以使用修改原始数组。试试:

foreach ($dataArray as $key_out => $data) {
    foreach ($data as $key => $value) {
        if($value > 1999) {
            $dataArray[$key_out][$key] = 1;
        } else {
            $dataArray[$key_out][$key] = 0;
        }
    }
}

答案 3 :(得分:0)

我知道这很难读,但这只是一个简短的代码。

我使用array_intersect在您的dataArray($ da)中找到零。
然后,我将array_replace与[1,1,1]数组一起使用(通过使用array_fill),并覆盖我发现的零。

$arr = [0,0,0];

foreach($dataArray as &$da){
    $da = array_replace(array_fill(0,count($da),1), array_intersect($da, $arr));
}

var_dump($dataArray);

输出

array(5) {
  [0]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
  [1]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(0)
    [2]=>
    int(1)
  }
  [2]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
  [3]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
  [4]=>
  &array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
}

https://3v4l.org/uaTcX