PHP 从未设置的数组中删除空值无法正常工作

PHP Remove empty value from array with unset not working correctly

我有一个包含句子的字符串。我希望将这些句子分解成一个数组,然后修改每个数组项,包括删除任何空的数组项。

这是我的:

//Explode string by dot
$items_array = explode(".", $raw_data);

//Loop through the array
foreach ($items_array as $i => $item) {

  //Remove any whitespace at front of item
  $item= ltrim($item);

  //Check if array item is empty and unset
  if($item === NULL){
    unset($items_array[$i]); 
  }

  //Reinstate the dot
  $item .= '.';
}

但是,这不起作用。我看到额外的“。”如果我在循环中放置一个 print(strlen($item));(在取消设置之后),我会看到一些 0 结果。

我知道 if 条件得到满足,因为如果我在其中打印,它会触发相同数量的 0 出现,例如:

 if($item === NULL){
      print("no value");
      unset($raw_inclusions[$i]); 
    }

我是不是做错了什么?

示例 $raw_data 字符串。假设我无法控制放在这里的内容。

$raw_data = "Brown fox. Lazy dog."

Expected/desired 结果:

$items_array = array("Brown fox.", "Lazy dog.");

当前结果:

$items_array = array("Brown fox.", "Lazy dog.", ".");

不清楚你想要达到什么目的,但下面的内容可能会对你有进一步的帮助。

$raw_data = "Brown fox. Lazy dog.";
$items_array = preg_split('/(?<=[.?!])\s+(?=[a-z0-9])/i', $raw_data);

$sentences = new ArrayIterator($items_array);
for ($sentences->rewind(); $sentences->valid(); $sentences->next()) {
  // Do something with sentence
  print $sentences->current() . "\n";
}

你的工作方式应该类似于

//Explode string by dot
$items_array = explode(".", $raw_data);

//Loop through the array and pass sentence by reference
foreach ($items_array as $i => &$item) {

  //Remove any whitespace at front of item
  $item = ltrim($item);

  //Check if array item is empty and unset (and continue)
  if(empty($item)){
    unset($items_array[$i]);
    continue;
  }
  // Reinstate the dot
  $item .= '.';
}

其实很简单,少了一行代码

您的代码

if($item === NULL){
    unset($items_array[$i]); 
}
//Reinstate the dot
$item .= '.';

做成这个

if($item === NULL){
    unset($items_array[$i]); 
}
else // <- The else is important
//Reinstate the dot
   $item .= '.';

你需要这条线

$items_array[$i] = $item;

任何工作(包括您的原始代码)

我会这样做:

$items_array = array_map(function($v) { return ltrim($v).'.'; },
                         array_filter(explode('.', $raw_data)));
  • .
  • 爆炸
  • 过滤空项目
  • 将每个项目映射到 trim 并添加 .