【问题标题】:Removing empty and whitespace values from an array (not array_filter)从数组中删除空值和空白值(不是 array_filter)
【发布时间】:2017-11-22 07:24:18
【问题描述】:

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

我有以下数组:

key:0 value: 

key:1 value:type

key:3 value:gear

key:4 value: 

key:5 value:rarity

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

我尝试了以下方法,但似乎没有奏效:

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

为了确定,甚至在 2 个 foreach 循环中进行了尝试,但仍然没有。

【问题讨论】:

  • 为什么没有array_filter
  • 这里有回声吗? 大声笑! 编辑:不再。
  • @Fred-ii-ninja edit ftw ;)
  • @castis lmho!
  • 对不起,我忘记输入问题了,我试过了,但它也没有用,除非我做错了?我试过 array_filter($array) 和 array_filter($array, ' ')

标签: php arrays filtering


【解决方案1】:

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

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

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

【讨论】:

  • 你先生,值得一品脱最好的啤酒。那已经奏效了。非常感谢。它使第一个值为空,但其余的都消失了……为什么会发生这种情况?
【解决方案2】:

我们不要急于回答“就这样做”。这是您尝试过的:

代码:(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";
}

它正在做你要求它做的事情。第一个循环取消设置不需要的元素并打印分配给$array 的“副本”的键和值foreach()“写入”和迭代。第二个循环写入并迭代 $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

现在,对于“执行此操作”部分...您有多种选择。以下是一些:

代码:(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。

以下的东西被认为是空的:

  • “”(空字符串)
  • 0(0为整数)
  • 0.0(0 作为浮点数)
  • “0”(0作为字符串)
  • 错误
  • 数组()
  • (一个空数组)
  • $var; (声明的变量,但没有值)

empty()array_filter() 使用了这种“贪婪”默认行为,如果您不知道的话,这真的会给您的任务带来麻烦。这就是为什么在我建议的方法中,我编写了一个自定义过滤条件,并在 foreach 循环中,我将 empty() 替换为 strlen() 调用。

【讨论】:

  • @DisplayName ...实际上,您在项目中做什么?您需要修改数组还是只回显某些元素?我假设您想要修改数组,并且您只是在回显以演示您失败的方法。如果你只是回显键和值,那么unset() 是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多