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 并添加
.
我有一个包含句子的字符串。我希望将这些句子分解成一个数组,然后修改每个数组项,包括删除任何空的数组项。
这是我的:
//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 并添加
.