PHP unset() 有选择地工作

PHP unset() selectively working

我知道这里有很多 unset() 问题,但这个不同。我正在尝试创建一个数组,该数组是目录的部分列表,文件名“.”、“..”、"feed.txt" 和 "index.php" 已删除。这是代码:

var_dump($posts);
echo "this is arrayElementIsString(posts, file) before ->" . arrayElementIsString($posts, "index.php") . "<-
";
foreach($posts as $file) {
    if($file == "." || $file == ".." || $file == "feed.txt" || $file == "index.php") {
        unset($posts[arrayElementIsString($posts, $file)]);
    }
}

echo "this is arrayElementIsString(posts, file) after ->" . arrayElementIsString($posts, "index.php") . "<-
";
var_dump($posts);

arrayElementIsString() 是我写的函数。它在数组中搜索特定字符串和 returns 该数组元素的索引。这是:

function arrayElementIsString($array, $searchString) {
    for($i=0; $i < count($array); $i++) {
        if((string)$array[$i] == $searchString) {
            return $i;
        }
    }
}

下面是这段代码的输出:

    array(6) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(20) "another-new-post.php"
  [3]=>
  string(8) "feed.txt"
  [4]=>
  string(9) "index.php"
  [5]=>
  string(17) "new-test-post.php"
}
this is arrayElementIsString(posts, file) before ->4<-
    this is arrayElementIsString(posts, file) after -><-
    array(3) {
  [2]=>
  string(20) "another-new-post.php"
  [4]=>
  string(9) "index.php"
  [5]=>
  string(17) "new-test-post.php"
}

第一个 var_dump 显示完整的目录列表,中间行的第一行显示 "index.php" 的索引,下一行显示已取消设置的值,第二个 var_dump 仍然在数组中显示 "index.php"。

我不明白为什么这适用于 .、.. 和 feed.txt,但 index.php 在明确取消设置后仍然列出。我试过将 index.php 文件移动到 if 语句的中间,看看它是否不会取消设置其他文件之一,但这没有任何影响

在 foreach 循环中删除数组中的元素是个坏主意。因此,您应该设置一个新数组并执行以下操作:

$newArray = array();
foreach($posts as $file) {
    if($file == "." || $file == ".." || $file == "feed.txt" || $file == "index.php") {
        continue;
    }
    $newArray[] = $file;
}
foreach($posts as $index => $file) {
    if($file == "." || $file == ".." || $file == "feed.txt" || $file == "index.php") {
        unset($posts[$index]);
    }
}

并永久删除 arrayElementIsString

保持简单:

$posts = array([data_here]);

foreach($posts as $key => $value) {
  if(in_array($value, array('.', '..', 'index.php', 'feed.txt')) {
    unset($posts[$key]);
  }
}

// Re-index your keys incase you want to use for loop later and what not
$posts = array_values($posts);