【问题标题】:How to clear empty values after last value in array如何在数组中的最后一个值之后清除空值
【发布时间】:2023-04-10 22:28:01
【问题描述】:

我有以下数组,我想要实现的是删除 i 值之后的所有 null 值。

原始数组:

$a = ["a", "b", null, null, null, null, "i", null, null, null, null];

想要的结果:

$a = ["a", "b", null, null, null, null, "i"];

我尝试过的事情: 所以我有一个想法,使用array_filter从空值中过滤数组,获取最后一个值的索引,然后获取原始数组中最后一项的索引,并使用for循环取消设置该范围,但这似乎不是一个有效的给我解决方案。所以我的问题是有没有其他更有效的方法来实现这一目标?谢谢。

【问题讨论】:

    标签: php arrays filter


    【解决方案1】:

    array_filter() 方法仅在所有非空值都是唯一的情况下才有效。如果有重复,array_search() 会找到第一个,而不是最后一个。

    您可以使用for 循环,从末尾开始直到找到非空条目:

    for ($i = count($a)-1; $i >= 0 && $a[$i] === null; $i--) {
        unset($a[$i]);
    }
    

    【讨论】:

    • 重新阅读问题后,我猜 array_search 实际上不会起作用,因为最后一个值可能会根据标题变化。
    • @JonStirling 它会起作用,因为他的想法是array_search(last($filtered), $a)。这样就可以找到变量值了。
    • 没错,我自己想的更多,但你显然是对的:P
    • 不确定谁对这个答案投了反对票,因为据我所知,这是实现既定目标的最务实和最快的方法之一。而且我完全忘记了反向循环选项......
    【解决方案2】:

    array_pop() 让您可以从数组末尾抓取元素;您可以继续这样做,直到找到非null 元素或数组为空。

    // This version modifies the array in-place
    function remove_trailing_nulls(&$arr) {
      while($arr) {
        $last = array_pop($arr);
        if($last !== null) {
          // Re-add the non-null element that was removed, and we're done
          $arr[] = $last;
          return;
        }
      }
    }
    
    // This version returns a new copy of the array
    function without_trailing_nulls($arr) {
      while($arr) {
        $last = array_pop($arr);
        if($last !== null) {
          // Re-add the non-null element that was removed, and we're done
          $arr[] = $last;
          break;
        }
      }
      return $arr;
    }
    

    【讨论】:

    • 感谢您的详细回答,效果很好!但是,在做了一些基准测试之后,我会选择反向 for 循环选项,因为它似乎更快一些。
    • 不用担心。希望其他人也能从解释中受益。
    【解决方案3】:
    $found = false;
    $item = "i";
    $a = ["a", "b", null, null, null, null, "i", null, null, null, null];
    print_r(array_filter($a, function($value) { 
      if($value == $item) {
        $found = true;
      }
      return !$found || !is_null($value) 
    }));
    

    这个想法基本上是我们在找到我们的项目后开始检查空值。

    【讨论】:

      【解决方案4】:

      只需使用array_filter 函数:

      $result = array_filter($arr, function($v, $k) use($arr) {
          $iKey = array_search('i', $arr);
          if(($iKey >= $k) || ($iKey < $k && !$v))
              return $v;
      }, ARRAY_FILTER_USE_BOTH)
      

      正如评论中提到的,如果i 可以是任何你可以简单地做以下单行的东西;):

      var_dump(array_slice($arr, 0, array_search(end(array_filter($arr)),$arr)+1));
      

      【讨论】:

      • 我不认为最后一个元素总是i,这只是一个例子。
      • 你的第二种方法是他在问题中描述的。
      • @Barmar 实际问题是关于性能的,我的第二个解决方案与您的解决方案一样有效(通过microtimexdebug 确认)。所以,我想这不值得投反对票;)
      • 投反对票是为了专门寻找字符串i
      【解决方案5】:
      print_r(array_filter($linksArray, function($value) { return $value !== ''; }));
      

      使用 array_filter() See more

      【讨论】:

      • 这将删除所有空值,而不仅仅是最后的空值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多