从数组中删除空值和空格值(不是array_filter)

时间:2017-11-21 21:37:13

标签: php arrays filtering

在删除数组中的空值时,我似乎遇到了障碍。

我有以下数组:

key:0 value: 

key:1 value:type

key:3 value:gear

key:4 value: 

key:5 value:rarity

如您所见,键0和键4都是空的(或填充空格)。

我尝试过以下操作,但它似乎没有效果:

foreach($array as $key=>$value){
    if ($value == ' ' || $value=='' || $value==' ' || empty($value)) { unset($array[$key]); }
    echo 'key:'.$key.' value:'.$value.'</br></br>';
}

甚至在2个foreach循环中尝试过它只是为了确定,但仍然没有。

2 个答案:

答案 0 :(得分:1)

有两个问题:首先,即使您取消设置数组键,也不会调用continue,这意味着您仍然会打印该值。其次 - 您可以轻松使用trim删除任何会影响比较的空白。

foreach ($array as $key => $value) {
    if (empty($value) || !trim($value)) {
        unset($array[$key]);
        continue;
    }

    echo 'key:' . $key . ' value:' . $value . '</br></br>';
}

答案 1 :(得分:0)

让我们不要急于#34;只是这样做&#34;回答。这是你尝试过的:

代码:(Demo

$array=[0=>'',1=>'type',3=>'gear',4=>' ',5=>'rarity'];
foreach($array as $key=>$value){
    if ($value == ' ' || $value=='' || $value==' ' || empty($value)) { unset($array[$key]); }
    echo 'key:'.$key.' value:'.$value."\n";
}
foreach($array as $key=>$value){
    if ($value == ' ' || $value=='' || $value==' ' || empty($value)) { unset($array[$key]); }
    echo 'key:'.$key.' value:'.$value."\n";
}

它正在做你要求它做的事情。第一个循环取消不需要的元素并打印键和键。分配给&#34;副本的值#34;是$array&#34;写的foreach()&#34; &安培;迭代。第二个循环写入&amp;迭代一个新的&#34;副本&#34; $array(先前已被第一个循环修改),您可以看到 empty-ish 元素现已消失。

输出:

key:0 value:        # unset $array[$key] and display $value (these are different entities
key:1 value:type
key:3 value:gear
key:4 value: 
key:5 value:rarity
key:1 value:type    # you see elements [0] and [4] are removed as intended
key:3 value:gear
key:5 value:rarity

现在,对于&#34;做这个&#34; part ...你有几个选择。以下是一些:

代码:(Demo

$array=[0=>'',1=>'type',3=>'gear',4=>' ',5=>'rarity'];

var_export(array_filter($array,function($v){return strlen(trim($v));}));  // professional grade: uses the function specifically designed to perform this function and the process will be instantly understood by future devs that read your code

var_export(preg_grep('/\S/',$array));  // A regular expression filter. Regex solutions should only be used when other methods will not suffice.  For this reason, this method is ill-advised

var_export(preg_grep('/^\s*$/',$array,PREG_GREP_INVERT));  // A regular expression filter (inverted pattern filteration). Regex solutions should only be used when other methods will not suffice.  For this reason, this method is ill-advised

foreach($array as $k=>$v){                    // possibly the fastest method, I didn't test, but it is also the most verbose and less descriptive as a technique
    if(!strlen(trim($v))){unset($array[$k]);}
}
var_export($array);

输出:

array (
  1 => 'type',
  3 => 'gear',
  5 => 'rarity',
)array (
  1 => 'type',
  3 => 'gear',
  5 => 'rarity',
)array (
  1 => 'type',
  3 => 'gear',
  5 => 'rarity',
)array (
  1 => 'type',
  3 => 'gear',
  5 => 'rarity',
)

现在是the manual给你的最重要的建议:

  

如果var存在并且具有非空的非零值,则返回FALSE。   否则返回TRUE。

     

以下内容被认为是空的:

     
      
  • &#34;&#34; (空字符串)
  •   
  • 0(0为整数)
  •   
  • 0.0(0作为浮动)
  •   
  • &#34; 0&#34; (0作为字符串)
  •   
  • NULL
  •   
  • FALSE
  •   
  • 阵列()
  •   
  • (空数组)
  •   
  • $变种; (声明的变量,但没有值)
  •   

这&#34;贪心&#34;默认行为由empty()array_filter()使用,如果您不知道,可能会给您的任务带来麻烦。这就是为什么在我建议的方法中,我编写了一个自定义过滤条件,在foreach循环中,我用empty()调用替换strlen()