【问题标题】:PHP remove empty items from sides of an arrayPHP从数组的两侧删除空项目
【发布时间】:2012-05-01 03:33:21
【问题描述】:

我有以下数组:

Array 
(
[0] => 
[1] => 
[2] => apple
[3] => 
[4] => orange
[5] => strawberry
[6] => 
)

如何从开头和结尾删除空项目,而不是从内部删除?最终的数组应如下所示:

Array 
(
[0] => apple
[1] => 
[2] => orange
[3] => strawberry
)

【问题讨论】:

    标签: php arrays list


    【解决方案1】:

    这里有一个方便的方法:

    while (reset($array) == '') array_shift($array);
    while (end($array) == '') array_pop($array);
    

    See it in action.

    必填注释:我正在使用与空字符串的松散比较,因为它看起来就像您在给出示例时想要的那样。如果您想对要删除的元素更加挑剔,请相应地自定义条件。

    更新:额外的标志性 PHP 丑陋代码可能会更快

    我突然想到,如果数组的开头和结尾有很多空元素,上面的方法可能不是最快的,因为它会一个一个地删除它们,在每个步骤中重新索引数组等等。所以这里是一种适用于任何阵列的解决方案,只需一步即可完成修整。警告:丑陋

    $firstNonEmpty = 0;
    $i = 0;
    foreach ($array as $val) {
        if ($val != '') {
            $firstNonEmpty = $i;
            break;
        }
        ++$i;
    }
    
    $lastNonEmpty = $count = count($array);
    end($array);
    for ($i = $count; $i > 0; --$i) {
        if (current($array) != '') {
            $lastNonEmpty = $i;
            break;
        }
        prev($array);
    }
    
    $array = array_slice($array, $firstNonEmpty, $lastNonEmpty - $firstNonEmpty);
    

    See it in action.

    【讨论】:

    • 干净性感。只为第一个和最后一个空工作。但是如果你仔细观察,[0] 和 [1] 是空的,并从“应该看起来像这样”中消失......也许是一个错误?
    • @DavidBélanger:咦,怎么了?
    • 哇,我比我的建议更喜欢这个! +1 先生
    • @Rocket 看看 OP 问题。 [0] 和 [1] 为空,[2] 为苹果。如果您查看“数组现在应该看起来......”苹果是 [0]。这意味着 [0] AND [1] 为空但已消失。所以它不仅是第一个也是最后一个。但在正文中,他说第一行和最后一行。这就是错误、错误输入或错误示例......
    • @DavidBélanger:“first”和“last”这两个词在任何地方都没有使用。 OP 要求从“开始”和“结束”中删除所有空白。
    【解决方案2】:

    你去吧:

    $Array = array('', Allo, '');
    
    if(isset($Array[0]) && empty($Array[0])){
        array_pop($Array);
    }
    
    $C = count($Array)-1;
    if(isset($Array[$C]) && empty($Array[$C])){
        array_shift($Array);
    }
    

    它将删除第一个和最后一个行。

    如果您想删除所有第一个和最后一个但只为空的,您需要这样做:

    $Array = array('', Allo, '', '', 'Toc', '', '', '');
    
    $i=0;
    foreach($Array as $Key => $Value){
        if(empty($Value)){
            unset($Array[$Key]);
        } else {
            break;
        }
        $i++;
    }
    
    $Array = array_reverse($Array);
    $i=0;
    foreach($Array as $Key => $Value){
        if(empty($Value)){
            unset($Array[$Key]);
        } else {
            break;
        }
        $i++;
    }
    
    $Array = array_reverse($Array);
    

    【讨论】:

    • 这不应该是某种循环吗?
    • @Rocket 为什么?如果您只想在空的情况下删除第一个和最后一个,不,因为您已经知道女巫一个是第一个和最后一个,所以您只需要检查它们是否为空。如果您想删除所有第一个和最后一个为空的人,那么是的,您需要一个循环,请参阅我的第二个脚本。
    • 原始帖子清楚地显示了从数组开头删除的两项,而不仅仅是一项。您的编辑解决了这个问题,但只是在这个上备份了@Rocket...
    • 数组是数字索引的。
    【解决方案3】:

    你可以使用

    array_pop($array); // remove the last element
    array_shift($array); // remove the first element
    

    您可以在之前进行一些简单的检查以确保第一个和/或最后一个索引为空

    【讨论】:

      【解决方案4】:

      这是另一种方法:

      <?php
      
      $array = array('', '', 'banana', '', 'orange', '', '', '');
      
      while ($array[0] == '')
      {
          array_shift($array);
      }
      
      $count = count($array);
      
      while ($array[$count - 1] == '')
      {
          array_pop($array);
          $count--;
      }
      
      print_r($array);
      
      ?>
      

      【讨论】:

      • 像其他解决方案一样,如果数组没有数字索引,这将不起作用。
      • 虽然你的说法完全正确,但他的数组是数字索引的。
      • @Dale:我认为这只是一个仅供参考:-P
      【解决方案5】:

      下面的 sn-p 将完成这项工作:

      function removeStartingEmptyIndexes($array)
      {
        foreach($array as $i => $item)
        {
          if(!empty($item)) {
            break;
          }
          else
          {
            unset($array[$i]);
          }
        }
      
        return $array;
      }
      
      function trimEmptyIndexes($array)
      {
        return array_reverse(removeStartingEmptyIndexes(array_reverse(removeStartingEmptyIndexes($array))));
      }
      
      $array = array("", "", "apple", "orange", "", "", "", "lemon", "", "");
      
      $array = trimEmptyIndexes($array);
      

      只需调用“trimEmptyIndexes($array)”

      【讨论】:

        【解决方案6】:

        试试这个

        foreach ($original_array as $index => $val) {
          if (is_empty($val)) {
            unset($original_array [$index]);
          } else {
            break;
          }
        
        }
        

        【讨论】:

        • 除非他希望“apple”和“orange”之间的空白仍然存在。
        【解决方案7】:
        while(strlen($array[0])==0)
            unset(array[0]);
        
        $doLoop=(strlen($array[ count(array)-1 ])==0);
        while ($doLoop){
            unset($array[ count(array)-1 ]);
            $doLoop=(strlen($array[ count(array)-1 ])==0);
        }
        

        【讨论】:

        • 对。当您确实可以拥有仅适用于汽车的解决方案时,为什么还要选择适用于汽车和飞机的解决方案。
        • 他的数组是数字索引的。
        • @Jon,一般来说,我同意你的方式更好 - 但这仍然是对手头问题的有效回答。
        • @Dale 是的,但解决方案应该成为一个函数和/或在任何地方都可以工作。 Jon 解决方案是完美的,因为它不需要数字索引。
        • 是的,我赞成他的回答,我只是在回复他所有的 cmets 数组确实是数字索引的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-15
        • 2011-10-30
        • 2021-10-19
        • 2017-01-01
        • 2020-12-07
        • 2021-10-03
        • 1970-01-01
        相关资源
        最近更新 更多