PHP unset()有选择地工作

时间:2016-03-07 15:57:49

标签: php arrays unset

我知道这里有很多这些未设置的问题,但这个问题有所不同。我试图创建一个数组,这是一个目录的部分列表,文件名为"。"," .."," feed.txt& #34;和" 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()是我写的一个函数。它在数组中搜索特定字符串并返回该数组元素的索引。这是:

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显示完整的目录列表,行之间的第一个显示&#34; index.php&#34;的索引,下一行显示未设置的值,第二个var_dump显示&#34 ;的index.php&#34;在数组中仍然。

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

3 个答案:

答案 0 :(得分:1)

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

永远删除arrayElementIsString

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

保持简单:

&#13;
&#13;
$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);
&#13;
&#13;
&#13;