以下是我的代码,并没有删除$arr[5]
元素,因此我尝试从数组中删除以#
开头的字符串
这是代码
<?php
$arr = [
'#EXTM3U',
'#EXTINF:177,Paul Dateh & Oren Yoel - Be More',
'Be More.mp3',
'#EXTINF:291,Christopher Toy - Just Because',
'Just Because.mp3',
'#EXTINF:238,Magnetic North - Drift Away',
'Drift Away.mp3'
];
for ($i = 0; $i <= count($arr); $i++) {
if ($arr[$i]{0} == '#') {
echo $arr[$i] . "\n";
unset($arr[$i]);
}
}
print_r($arr);
?>
答案 0 :(得分:3)
原因: - 您正在计算循环内的数组长度,并且每当数组中的任何值得到unset()
时,数组的长度减少并且值count($array)
的变化(简单地减少了)
所以逻辑上你的第5和第6个元素永远不会经历if
条件(由于数组的长度减少,它们永远不会被循环遍历)
解决方案1: - 将计数放在外面,它会正常工作: -
$count = count($arr);
//loop start from 0 so use < only otherwise, sometime you will get an undefined index error
for ($i = 0; $i < $count; $i++) {
if ($arr[$i]{0} == '#') {
//echo $arr[$i] . "\n";
unset($arr[$i]);
}
}
print_r($arr);
输出: - https://eval.in/996494
解决方案2: - 这就是为什么我更喜欢foreach()
超过for()
循环
foreach($arr as $key=> $ar){
if ($ar[0] == '#') {
unset($arr[$key]);
}
}
print_r($arr);
输出: - https://eval.in/996502
答案 1 :(得分:1)
尝试使用其他数组来推送正确的值。您在每次迭代时计算String filePath = "/storage/emulated/0/Pictures/example_video.mp4";
GlideApp
.with(context)
.asBitmap()
.load(Uri.fromFile(new File(filePath)))
.into(imageViewGifAsBitmap);
,当您执行count($arr);
时,您的数组变小,count($arr);
返回较小的值,因此最后的元素不会进行比较,尝试使用变量计算结果在循环之前进行更改:
count($arr);
或者在附加数组的帮助下删除坏元素,将好元素放在新数组中,不要将它们从输入数组中删除:
<?php
//...
$start_count = count($arr);
for ($i = 0; $i <= $start_count; $i++) {
if ($arr[$i]{0} == '#') {
echo $arr[$i] . "\n";
unset($arr[$i]);
}
}
答案 2 :(得分:1)
更多空间:
for ($i = 0; $i < count($arr); $i++) {
if (strpos($arr[$i], '#') !== false) {
echo "<br/>";
} else {
echo $arr[$i]."<br/>";
}
}