如何在PHP中根据键名删除数组项?

5

我想用foreach循环遍历数组来检查一个键名是否存在。如果存在这个键,我想删除包含它的数组项。

我编写了以下代码,在第一个条件中检查了数组项的值,如果数组项的值等于空字符串"",则将该数组项的值设置为"-"(破折号字符)。第一个条件运行良好。

foreach ($domaindata['administrative'] as $key => $value) {
    if ($value == "") {
      $value = "-";
    } 
    else if ($key == "type") {
      unset ($domaindata[$key]);
    }
    echo "<b>$key: </b>$value<br>";
}

现在我添加了第二个条件,检查$key名称是否存在,如果存在,则删除该数组项。
这是"else if"部分,但是该数组项仍然被输出。
else if ($key == "type") {
      unset ($domaindata[$key]);
    }

数组的结构如下:

Array
(
    [name] => OWNER NAME
    [address] => OWNER ADDRESS
    [post:number] => OWNER POST OFFICE NUMBER
    [city] => OWNER CITY
    [country] => OWNER COUNTRY CODE
    [telephone] => OWNER TELEPHONE NUMBER
    [fax] => OWNER FAX NUMBER                   // could be empty
    [email] => OWNER EMAIL ADDRESS
    [type] => person
    [user:type] => Fizička osoba
)

除非您再次将$value分配给$key,否则它不会改变。简单的方法是使用$key => &$value,这样每当您编写$value =“-”时,它都会直接修改数组。在foreach循环结束时运行unset以清除变量。 - Bankzilla
2个回答

10

你正在对$domaindata['administrative']进行foreach循环,而不是对$domaindata进行。因此要取消设置,需要执行以下操作:

unset($domaindata['administrative'][$key]);
unset($domaindata['administrative'][$key]);

关于为什么您的循环仍然显示type是因为unset不会影响循环(您已经将副本复制到循环变量中)。我建议在foreach循环之前执行此操作

if(isset($domaindata['administrative']['type'])) unset($domaindata['administrative']['type']);

你可以完全删除elseif块(这将减少一些开销)


我认为我的条件不会在 else if ($key == "type") 上评估,因为数组项仍然存在。 - Alan Kis
1
@AlanKis 我更新了我的答案,以帮助你处理那个问题。 - Machavity

2
您正在遍历$domaindata ['administrative'],而不是$domaindata。因此,您还应该从中unset元素:
else if ($key == "type") {
  unset ($domaindata['administrative'][$key]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接