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);
我知道这里有很多 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);