用周围的null和0替换数组中的值

3

我有一个整数值的集合,它是从另一个函数的结果中构建的,该函数每次可能具有不同的值。在 PHP 中考虑以下内容:

$arr = [0,0,2,2,0,0,0,3,3];

我需要将其转换为:

$newArr = [null,0,2,2,0,null,0,3,3];

我希望实现的目标是:如果一个数值大于0,它的邻居应该为0,其余部分应该为空。
最佳策略是什么?

它应该适用于您。 - Karol Gasienica
非常感谢大家的贡献,我已经接受了@Casimir et Hippolyte提供的最有帮助的答案。继续保持! - krikkaa
你可以投票支持那些也起作用的解决方案 ;) 谢谢! - Karol Gasienica
1
我很想帮忙,但是我还没有足够的声望:( - krikkaa
6个回答

2

遍历整个数组,我们对每个元素进行三个条件的评估:

1. 元素为零。

2. 前一个元素已设置,并且它等于零或null。

3. 下一个元素已设置,并且它等于零或null。

<?php
    foreach($array as $key => $element)
    {
        if($element == 0 && ((isset($array[$key - 1]) && !$array[$key - 1]) || (isset($array[$key + 1]) && !$array[$key + 1])))
        {
            $array[$key] = null;
        }
    }
?>

2

操作符优先级玩法:

$zero = true;

$arr = [0,0,2,2,0,0,0,3,3];
$newArr = [];

foreach($arr as $k=>$v) {
    if ($v) {
        $newArr[] = $v;
        $zero = false;
    } else {
        if ($zero and isset($arr[$k+1]) && !$arr[$k+1] || !isset($arr[$k+1]))
            $newArr[] = null;
        else
            $newArr[] = 0;

        $zero = true;
    }
}

print_r($newArr);

0

我认为这对你应该有效:

<?php
$arr = [0,0,2,2,0,0,0,3,3];
$new_array = $arr;

$array_count = count($arr);

for ($i=0; $i<$array_count; $i++) {
    if ($i == 0 && $arr[$i+1] == 0) {   
        $new_array[$i] = null;
    } elseif ($i == ($array_count-1) && $arr[$i-1] == 0) {  
        $new_array[$i] = null;
    } elseif ($arr[$i-1] == 0 && $arr[$i+1] == 0) {     
        $new_array[$i] = null;
    }
}
echo "<pre>";
print_r($new_array);

?>

为什么应该让楼主“尝试这个”?一个好的答案总是会解释做了什么以及为什么以这种方式完成,不仅为了楼主,也为了未来访问Stack Overflow的用户。 - Jay Blanchard

0
我们需要检查三个条件:是否存在,前一个是否为零,后一个是否为零。 您可以将前两个条件合并为第三个条件。 为了简单起见,将其分解。
$array = [0,0,2,2,0,0,0,3,3];

$newArray = [];

foreach ($array as $key => $val) {

    $previous = NULL;
    $next = NULL;

    if (isset($array[$key + 1])) {
        $next = $array[$key + 1];
    }

    if ($key != 0) {
        $previous = $array[$key - 1];
    }

    if ($val === 0 && $next == 0 && $previous == 0) {
        $newArray[] = 'NULL';
    } else {
        $newArray[] = $val;
    }

}

0

另一种方法是这样的:

$arr = [0,0,2,2,0,0,0,3,3];

foreach($arr as $key => $value){
    if($arr[$key] > 0 && isset($arr[$key - 1]) && $arr[$key - 1] == 0){
        if(isset($arr[$key - 2]) && $arr[$key - 2] == 0){
            $arr[$key - 2] = null;  
        }
    }
    if($arr[$key] > 0 && isset($arr[$key + 1]) && $arr[$key + 1] == 0){
        if(isset($arr[$key + 2]) && $arr[$key + 2] == 0){
            $arr[$key + 2] = null;  
        }
    }
}
echo '<pre>';
print_r($arr);
echo '</pre>';

在这里,我首先寻找正值,然后检查邻居是否为0,如果是,则将邻居的邻居设置为null。


-1
<?php

    $arr        = [0,0,2,2,0,0,0,3,3];
    $extra      = [];


    for($x=0; $x<count($arr); $x++){
        if($arr[$x] == 0){
            $tmp = isset($tmp)?$tmp:[];
            $tmp[]=$x;
        }else{
            if(isset($tmp)){
                $extra[]  = $tmp;
                unset($tmp);
            }
        }
    }
    foreach($extra as $subArr){
        if(count($subArr) == 2){
            $arr[$subArr[0]] = null;
            $arr[$subArr[1]] = 0;
        }else if(count($subArr) == 3){
            $arr[$subArr[0]] = 0;
            $arr[$subArr[1]] = null;
            $arr[$subArr[2]] = 0;
        }
    }
    var_dump($arr);
    // YIELDS::
        array (size=9)
          0 => null
          1 => int 0
          2 => int 2
          3 => int 2
          4 => int 0
          5 => null
          6 => int 0
          7 => int 3
          8 => int 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接