【问题标题】:Remove empty array elements删除空数组元素
【发布时间】:2011-04-08 22:21:52
【问题描述】:

根据用户提交的内容,我的数组中的一些元素是空字符串。我需要删除这些元素。我有这个:

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);

但它不起作用。 $linksArray 仍然有空元素。我也尝试过使用empty() 函数,但结果是一样的。

【问题讨论】:

  • 我认为值得一提的是上面的代码不起作用,因为 unset(...) 操作的是由 foreach 循环创建的变量,而不是显然保持原样的原始数组循环。
  • if(!empty($link)) { echo $link; } 这对我有用
  • 你正在更改未引用的 $link!使用 foreach($linksArray as $key => $link) unset(linksArray[$key])

标签: php arrays string


【解决方案1】:

只是想为循环提供替代方案...同时解决键中的空白...

就我而言,我想在操作完成后保留顺序数组键(不仅仅是奇数,这是我所关注的。设置代码以查找奇数键对我来说似乎很脆弱,而不是未来 -友好。)

我在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter 和 array_slice 的组合可以解决问题。

$example = array_filter($example);
$example = array_slice($example,0);

不知道效率或基准,但它确实有效。

【讨论】:

  • 我认为array_values 的结果与array_slice 相同。就稍后阅读代码和理解它在做什么而言,这似乎更直观。
【解决方案2】:

当您处理字符串数组时,您可以简单地使用array_filter(),它可以方便地为您处理所有这些:

print_r(array_filter($linksArray));

请记住,如果没有提供回调,所有等于FALSE 的数组条目(请参阅converting to boolean)都将被删除。因此,如果您需要保留确切的字符串 '0' 的元素,则需要自定义回调:

// PHP 7.4 and later
print_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));

// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));

// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

注意:如果需要在删除空元素后重新索引数组,请使用:$linksArray = array_values(array_filter($linksArray));

【讨论】:

  • array_filter 应该删除空元素。如果 PHP 对空的定义与您的定义不完全相同,那么您可以在回调选项中填写一个匿名函数,该函数会抛出不需要的元素。显然,您必须拥有 php 5.3 或更高版本才能使用匿名回调。 stackoverflow.com/questions/2412299/…
  • 注意array_filter 不会重新索引数组索引(在for 语句中使用进程数组时可能会出现问题)。所以用 array_values 函数包装它。
  • 答案不正确,因为它也会删除false 元素。 (php.net/manual/en/function.array-filter.php)
  • @Deji 您是否尝试过在过滤之前打印该数组?我认为第二次设置a 只会重置第一次。
  • @Cranio:这已经被另一条评论所涵盖。这不是错误的,但可能比您的 要求更广泛。这并不意味着其他人仍然无法找到它的帮助;毕竟,如果你只有数组中的字符串,那么这个答案只会删除空的。
【解决方案3】:

简而言之:

这是我建议的代码:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

说明:

我认为使用 array_filter 很好,但还不够,因为值就像 space\n,... 保留在数组中,这通常很糟糕。

所以我建议你混合使用‍‍array_filterarray_map

array_map 用于修剪,array_filter 用于删除空值,strlen 用于保留0 值,array_values 用于在需要时重新索引。

样品:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");

// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);

// "a"
$new2 = array_filter(array_map('trim', $myarray));

// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');

// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));

var_dump($new1, $new2, $new3, $new4);

结果:

array(5) {
  [0]=>
" string(1) "
  [1]=>
  string(1) "
"
  [2]=>
  string(2) "
"
  [4]=>
  string(1) " "
  [6]=>
  string(1) "a"
}
array(1) {
  [6]=>
  string(1) "a"
}
array(2) {
  [5]=>
  string(1) "0"
  [6]=>
  string(1) "a"
}
array(2) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "a"
}

在线测试:

http://sandbox.onlinephpfunctions.com/code/e02f5d8795938be9f0fa6f4c17245a9bf8777404

【讨论】:

    【解决方案4】:

    我觉得array_walk在这里更合适

    $linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);
    
    array_walk($linksArray, function(&$v, $k) use (&$linksArray){
        $v = trim($v);
        if ($v == '')
            unset($linksArray[$k]);
    });
    print_r($linksArray);
    

    输出:

    Array
    (
        [0] => name
        [2] => 342
        [3] => 0
        [4] => 0
    )
    
    • 我们确保即使用户添加了多个空格,也会删除空值

    • 我们还从有效值中删除了空格

    • 最后,只有 (null)、(Boolean False) 和 ('') 会被视为空字符串

    至于 False 可以删除它,因为 AFAIK 用户无法提交布尔值。

    【讨论】:

      【解决方案5】:

      有了这些类型的东西,最好明确说明你想要什么和不想要什么。

      这将有助于下一个人不会在没有回调的情况下对 array_filter() 的行为感到惊讶。例如,我最终回答了这个问题,因为我忘记了array_filter() 是否删除了NULL。我本可以使用下面的解决方案并得到答案,但我浪费了时间。

      此外,从某种意义上说,该逻辑与语言无关,即可以将代码复制到另一种语言中,而无需了解没有传递回调时像 array_filter 这样的 php 函数的行为。

      在我的解决方案中,发生的事情一目了然。删除条件以保留某些内容或添加新条件以过滤其他值。

      忽略array_filter() 的实际使用,因为我只是向它传递了一个自定义回调 - 如果你愿意,你可以继续将它提取到它自己的函数中。我只是将它用作foreach 循环的糖。

      <?php
      
      $xs = [0, 1, 2, 3, "0", "", false, null];
      
      $xs = array_filter($xs, function($x) {
          if ($x === null) { return false; }
          if ($x === false) { return false; }
          if ($x === "") { return false; }
          if ($x === "0") { return false; }
          return true;
      });
      
      $xs = array_values($xs); // reindex array   
      
      echo "<pre>";
      var_export($xs);
      

      这种方法的另一个好处是,您可以将过滤谓词分解为一个抽象函数,该函数过滤每个数组的单个值并构建一个可组合的解决方案。

      请参阅此示例和输出的内联 cmets。

      <?php
      
      /**
       * @param string $valueToFilter
       *
       * @return \Closure A function that expects a 1d array and returns an array
       *                  filtered of values matching $valueToFilter.
       */
      function filterValue($valueToFilter)
      {
          return function($xs) use ($valueToFilter) {
              return array_filter($xs, function($x) use ($valueToFilter) {
                  return $x !== $valueToFilter;
              });
          };
      }
      
      // partially applied functions that each expect a 1d array of values
      $filterNull = filterValue(null);
      $filterFalse = filterValue(false);
      $filterZeroString = filterValue("0");
      $filterEmptyString = filterValue("");
      
      $xs = [0, 1, 2, 3, null, false, "0", ""];
      
      $xs = $filterNull($xs);        //=> [0, 1, 2, 3, false, "0", ""]
      $xs = $filterFalse($xs);       //=> [0, 1, 2, 3, "0", ""]
      $xs = $filterZeroString($xs);  //=> [0, 1, 2, 3, ""]
      $xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]
      
      echo "<pre>";
      var_export($xs); //=> [0, 1, 2, 3]
      

      现在您可以使用 pipe() 动态创建一个名为 filterer() 的函数,该函数将为您应用这些部分应用的函数。

      <?php
      
      /**
       * Supply between 1..n functions each with an arity of 1 (that is, accepts
       * one and only one argument). Versions prior to php 5.6 do not have the
       * variadic operator `...` and as such require the use of `func_get_args()` to
       * obtain the comma-delimited list of expressions provided via the argument
       * list on function call.
       *
       * Example - Call the function `pipe()` like:
       *
       *   pipe ($addOne, $multiplyByTwo);
       *
       * @return closure
       */
      function pipe()
      {
          $functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
          return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
              return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
                  $functions, // an array of functions to reduce over the supplied `$arg` value
                  function ($accumulator, $currFn) { // the reducer (a reducing function)
                      return $currFn($accumulator);
                  },
                  $initialAccumulator
              );
          };
      }
      
      /**
       * @param string $valueToFilter
       *
       * @return \Closure A function that expects a 1d array and returns an array
       *                  filtered of values matching $valueToFilter.
       */
      function filterValue($valueToFilter)
      {
          return function($xs) use ($valueToFilter) {
              return array_filter($xs, function($x) use ($valueToFilter) {
                  return $x !== $valueToFilter;
              });
          };
      }
      
      $filterer = pipe(
          filterValue(null),
          filterValue(false),
          filterValue("0"),
          filterValue("")
      );
      
      $xs = [0, 1, 2, 3, null, false, "0", ""];
      $xs = $filterer($xs);
      
      echo "<pre>";
      var_export($xs); //=> [0, 1, 2, 3]
      

      【讨论】:

        【解决方案6】:

        另一个用于从数组中删除空(“”空字符串)元素的衬线。

        $array = array_filter($array, function($a) {return $a !== "";});
        

        注意:这段代码故意保留null0false元素。


        或者也许你想先修剪你的数组元素:

        $array = array_filter($array, function($a) {
            return trim($a) !== "";
        });
        

        注意:此代码还删除了 nullfalse 元素。

        【讨论】:

        • 正是我需要的,这也与older PHPs兼容,谢谢! ;-)
        • @JohnK 错了。要做到这一点,就像用户想要的回调 is 一样,除非你想删除 alzo zeroes 和其他虚假值。
        • 哦...这绝对是可爱的。应该是被接受的。
        【解决方案7】:
        function trim_array($Array)
        {
            foreach ($Array as $value) {
                if(trim($value) === '') {
                    $index = array_search($value, $Array);
                    unset($Array[$index]);
                }
            }
            return $Array;
        }
        
        【解决方案8】:

        根据您的方法,您可以在另一个数组中捕获这些元素并使用如下所示的元素,

        foreach($linksArray as $link){
           if(!empty($link)){
              $new_arr[] = $link
           }
        }
        
        print_r($new_arr);
        

        【讨论】:

          【解决方案9】:

          关于这个话题最流行的答案绝对是不正确的。

          考虑以下 PHP 脚本:

          <?php
          $arr = array('1', '', '2', '3', '0');
          // Incorrect:
          print_r(array_filter($arr));
          // Correct:
          print_r(array_filter($arr, 'strlen'));
          

          这是为什么?因为包含单个 '0' 字符的字符串也评估为布尔值 false,所以即使它不是空字符串,它仍然会被过滤。那将是一个错误。

          将内置的 strlen 函数作为过滤函数将起作用,因为它为非空字符串返回一个非零整数,为空字符串返回一个零整数。非零整数在转换为布尔值时始终评估为真,而零整数在转换为布尔值时始终评估为假。

          所以,绝对的、确定的、正确的答案是:

          $arr = array_filter($arr, 'strlen');
          

          【讨论】:

          • 同意。对于那些数组包含字符串的人来说,这应该是公认的答案
          • 赞成。一个比许多其他答案更好的答案,但应该注意的是,当前接受的答案在技术上并不正确,因为“空”确实在 PHP 中具有特殊含义。 (一些符合“空”条件的值:0""null
          • 它们并没有错,这都是关于上下文的。在某些情况下,保留值 0 可能很重要。所以请不要说除了你以外的人都是错的
          • 如果数组包含另一个数组,则会中断:strlen() expects parameter 1 to be string, array given
          • 你可以说这也可以是一个很好的方法(而不是说别人不正确)来实现一个人想要的动作。基本上不是所有的情况都是相似的。虽然这种方法对我的情况有效。
          【解决方案10】:
          foreach($linksArray as $key => $link) 
          { 
              if($link === '') 
              { 
                  unset($linksArray[$key]); 
              } 
          } 
          print_r($linksArray); 
          

          【讨论】:

          • 简洁、易读且安全的解决方案,不会删除false0。考虑到这是与接受的答案在同一分钟发布的(这是不安全且不正确的),我只能假设您的 8 个赞成票与接受的答案的 649 相比,后者是一个单行解决方案.
          • @rybo111 - 可能,尽管在array_filter() 的回调中使用该逻辑比foreach() 循环更简洁
          • 也许更快,但您的解决方案是最易读的,这一点很重要。对于那些使用需要trim() 的解决方案的人,我会推荐if(is_string($link) &amp;&amp; trim($link) === '')
          【解决方案11】:

          您可以使用array_filter 删除空元素:

          $emptyRemoved = array_filter($linksArray);
          

          如果您的数组中有(int) 0,您可以使用以下内容:

          $emptyRemoved = remove_empty($linksArray);
          
          function remove_empty($array) {
            return array_filter($array, '_remove_empty_internal');
          }
          
          function _remove_empty_internal($value) {
            return !empty($value) || $value === 0;
          }
          

          编辑:也许您的元素本身不是空的,而是包含一个或多个空格...您可以在使用array_filter之前使用以下内容@

          $trimmedArray = array_map('trim', $linksArray);
          

          【讨论】:

          • 我刚刚将它添加到 BoltClock 接受的答案中,您可以简单地执行 array_filter($foo, 'strlen') 以避免“0”问题,并且只删除那些长度为零的问题。
          • @nezZario:假设您的数组中只有 scalar 项目是的。否则,你不能这样做。
          • 对 php 使用 lambda >= 5.3 function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
          • array_map() 做了魔法因为我在那些空数组中有空格!
          【解决方案12】:
          $out_array = array_filter($input_array, function($item) 
          { 
              return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
          }
          );
          

          【讨论】:

            【解决方案13】:

            我必须这样做才能保持 (string) 0 的数组值

            $url = array_filter($data, function ($value) {
              return (!empty($value) || $value === 0 || $value==='0');
            });
            

            【讨论】:

              【解决方案14】:

              投票最多的答案是错误,或者至少不完全正确,因为 OP 只讨论空白字符串。以下是详尽的解释:

              是什么意思?

              首先,我们必须就empty 的含义达成一致。你的意思是过滤掉:

              1. 只有空字符串 ("")?
              2. 严格错误值? ($element === false)
              3. falsey 值? (即 0、0.0、""、"0"、NULL、array()...)
              4. 相当于 PHP 的 empty() 函数?

              如何过滤掉这些值

              过滤空字符串

              $filtered = array_diff($originalArray, array(""));
              

              要仅过滤出 严格 false 值,您必须使用 回调 函数:

              $filtered = array_diff($originalArray, 'myCallback');
              function myCallback($var) {
                  return $var === false;
              }
              

              回调对于您想要过滤掉“假”值的任何组合也很有用,除了一些。 (例如过滤每个nullfalse等,只留下0):

              $filtered = array_filter($originalArray, 'myCallback');
              function myCallback($var) {
                  return ($var === 0 || $var === '0');
              }
              

              第三种和第四种情况(最终出于我们的目的)是等效的,为此您只需要使用默认值即可:

              $filtered = array_filter($originalArray);
              

              【讨论】:

              • 如果你想取出nullfalse,但保留0,你也可以使用php内置的strlen函数作为你的回调。
              【解决方案15】:

              试试这个** **示例

              $or = array(
                      'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
                      'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
                      'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
                      'PersonalInformation.dob' => $this->request->data['User']['dob'],
                      'User.email' => $this->request->data['User']['email'],
                  );
              
              
              
               $or = array_filter($or);
              
                  $condition = array(
                      'User.role' => array('U', 'P'),
                      'User.user_status' => array('active', 'lead', 'inactive'),
                      'OR' => $or
                  );
              

              【讨论】:

              • 这是什么?还有很多其他非常相关的答案。你在这里添加什么?
              • 查看网址这里有什么问题!!/*删除空数组元素*/
              【解决方案16】:

              你可以这样做

              array_filter($array)
              

              array_filter: "如果没有提供回调,所有等于 FALSE 的输入条目都将被删除。"这意味着值为 NULL、0、'0'、''、FALSE、array() 的元素也将被删除。

              另一个选项正在做

              array_diff($array, array(''))
              

              这将删除值为 NULL、'' 和 FALSE 的元素。

              希望这会有所帮助:)

              更新

              这是一个例子。

              $a = array(0, '0', NULL, FALSE, '', array());
              
              var_dump(array_filter($a));
              // array()
              
              var_dump(array_diff($a, array(0))) // 0 / '0'
              // array(NULL, FALSE, '', array());
              
              var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
              // array(0, '0', array())
              

              总结一下:

              • 0 或 '0' 将删除 0 和 '0'
              • NULL、FALSE 或 '' 将删除 NULL、FALSE 和 ''

              【讨论】:

                【解决方案17】:

                如果您正在使用数值数组并且需要在删除空元素后重新索引数组,请使用 array_values 函数:

                array_values(array_filter($array));
                

                另见:PHP reindex array?

                【讨论】:

                  【解决方案18】:
                  $my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");   
                  
                  foreach ($my as $key => $value) {
                      if (is_null($value)) unset($my[$key]);
                  }
                  
                  foreach ($my as $key => $value) {
                      echo   $key . ':' . $value . '<br>';
                  } 
                  

                  输出

                  1:5

                  2:6

                  【讨论】:

                    【解决方案19】:

                    删除空数组元素

                    function removeEmptyElements(&$element)
                    {
                        if (is_array($element)) {
                            if ($key = key($element)) {
                                $element[$key] = array_filter($element);
                            }
                    
                            if (count($element) != count($element, COUNT_RECURSIVE)) {
                                $element = array_filter(current($element), __FUNCTION__);
                            }
                    
                            return $element;
                        } else {
                            return empty($element) ? false : $element;
                        }
                    }
                    
                    $data = array(
                        'horarios' => array(),
                        'grupos' => array(
                            '1A' => array(
                                'Juan' => array(
                                    'calificaciones' => array(
                                        'Matematicas' => 8,
                                        'Español' => 5,
                                        'Ingles' => 9,
                                    ),
                                    'asistencias' => array(
                                        'enero' => 20,
                                        'febrero' => 10,
                                        'marzo' => '',
                                    )
                                ),
                                'Damian' => array(
                                    'calificaciones' => array(
                                        'Matematicas' => 10,
                                        'Español' => '',
                                        'Ingles' => 9,
                                    ),
                                    'asistencias' => array(
                                        'enero' => 20,
                                        'febrero' => '',
                                        'marzo' => 5,
                                    )
                                ),
                            ),
                            '1B' => array(
                                'Mariana' => array(
                                    'calificaciones' => array(
                                        'Matematicas' => null,
                                        'Español' => 7,
                                        'Ingles' => 9,
                                    ),
                                    'asistencias' => array(
                                        'enero' => null,
                                        'febrero' => 5,
                                        'marzo' => 5,
                                    )
                                ),
                            ),
                        )
                    );
                    
                    $data = array_filter($data, 'removeEmptyElements');
                    var_dump($data);
                    

                    ¡有效!

                    【讨论】:

                      【解决方案20】:

                      对于多维数组

                      $data = array_map('array_filter', $data);
                      $data = array_filter($data);
                      

                      【讨论】:

                        【解决方案21】:

                        只有一行: 更新(感谢@suther):

                        $array_without_empty_values = array_filter($array);
                        

                        【讨论】:

                        • 不需要你的第二个参数:$clean_array = array_filter($dirty_array);
                        【解决方案22】:
                        $a = array(1, '', '', '', 2, '', 3, 4);
                        $b = array_values(array_filter($a));
                        
                        print_r($b)
                        

                        【讨论】:

                        • array_values 使索引连续。谢谢:)
                        【解决方案23】:

                        使用array_filter 函数删除空值:

                        $linksArray = array_filter($linksArray);
                        print_r($linksArray);
                        

                        【讨论】:

                        • 他要去掉空字符串,不等于空值。
                        【解决方案24】:
                        foreach($arr as $key => $val){
                           if (empty($val)) unset($arr[$key];
                        }
                        

                        【讨论】:

                        • 简单,直接!
                        【解决方案25】:

                        我使用以下脚本从数组中删除空元素

                        for ($i=0; $i<$count($Array); $i++)
                          {
                            if (empty($Array[$i])) unset($Array[$i]);
                          }
                        

                        【讨论】:

                          【解决方案26】:
                              $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
                              $myarray = array_filter($myarray);            //removes all null values
                          

                          【讨论】:

                          • strlen 也删除了 false :(
                          • 仅当 false 为字符串时。布尔值 false 没有字符串长度。
                          【解决方案27】:
                          $linksArray = array_filter($linksArray);
                          

                          “如果没有提供回调,所有等于 FALSE 的输入条目都将被删除。” -- http://php.net/manual/en/function.array-filter.php

                          【讨论】:

                          • 我在谷歌搜索问题后也尝试了这个。不幸的是,它给我留下了空白元素。
                          • @Will:你确定吗?它也删除了空字符串,我成功地测试了这个。也许您的输入值包含空格,应该先修剪。根据boolean conversion rules,空字符串被评估为假,因此被array_filter删除。
                          猜你喜欢
                          • 2023-03-09
                          • 2018-08-06
                          • 2013-01-26
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多