我有以下数组
$a = ["one", "dos" => "two", "three"];
正如您所看到的那样,第二个元素的值设置明确,但其他两个项目没有。
我想遍历数组,但做一些不同的事情,这取决于是否明确设置了该项的键。有点像这样:
foreach($a as $value){
if( has_explicit_key($value) )
// Do something
else
// Do other stuff
}
我怎样才能做到这一点?
PS:我想我可以检查密钥是否是一个整数,但如果密钥明确设置为整数,那就不行了,对吗?
答案 0 :(得分:2)
试试这个
foreach($a as $key=>$value){
if( is_int($key) )
// Do something
else
// Do other stuff
}
这是最接近的方法,因为键通常是0,1,2 ......
答案 1 :(得分:1)
在您的特定情况下,您可以利用没有显式字符串键的元素自动接收整数索引的事实:
$a = ["one", "dos" => "two", "three"];
foreach ($a as $k => $v) {
if (is_int($k)) {
// Do something
} else {
// Do other stuff
}
}
如果允许显式键是除字符串之外的标量(整数,浮点数,布尔值等),则无法(在运行时)区分用户提供的非字符串键和整数解析器填写的密钥。具体来说,请参阅PHP源函数zend_ast_add_array_element
。在该函数中,当未明确给出键(偏移IS_UNDEF
)时,PHP会为其分配zend_hash_next_index_insert
和records no bookkeeping note of that fact。
现在,如果你不介意,并且能够静态分析数据结构,只需tokenize或parse PHP代码,看看T_DOUBLE_ARROW
是否在数组值之前。这可能不值得付出努力,只适用于静态代码。
答案 2 :(得分:0)
您可以使用
循环遍历数组foreach($a as $key => $value) {
/* stuff */
}
要检查密钥是否已明确设置,可能只能通过检查密钥是否为数字来完成(PHP会将数字键分配给数组中没有任何键的值)。 当然,这意味着您将无法检测到明确设置并且为数字的密钥。
所以,除非有一些功能(我不知道),否则这将是唯一的方法。