我有以下数组,我试图实现的是删除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 loop 取消设置该范围,但这对我来说似乎不是一个有效的解决方案。所以我的问题是,还有其他更有效的方法来实现这一点吗?谢谢。
仅当所有非 null 值都是唯一的时,array_filter()
方法才有效。如果有重复项,array_search()
会找到其中的第一个,而不是最后一个。
您可以使用从末尾到找到非 null 条目的 for
循环:
for ($i = count($a)-1; $i >= 0 && $a[$i] === null; $i--) {
unset($a[$i]);
}
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;
}
$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)
}));
这个想法基本上是我们在找到我们的项目后开始检查空值。
只需使用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));
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));
使用 array_filter() 查看更多