我有以下数组
$a = ["one", "dos" => "two", "three"];正如您所看到的,第二个元素显式地设置了其值的键,但其他两个元素没有。
我想循环遍历数组,但要做一些不同的事情,这取决于该项的键是否显式设置。有点像这样:
foreach($a as $value){
if( has_explicit_key($value) )
// Do something
else
// Do other stuff
}我如何才能做到这一点?
PS:我想我可以检查键是否是整数,但是如果键被显式设置为整数,这将不起作用,对吧?
发布于 2014-12-10 23:40:15
尝尝这个
foreach($a as $key=>$value){
if( is_int($key) )
// Do something
else
// Do other stuff
}这是最接近的方法,因为密钥通常是,0,1,2......
发布于 2014-12-10 23:39:40
在您的特定情况下,您可以利用没有显式字符串键的元素自动接收整数索引的事实:
$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 bookkeeping note of that fact的键。
现在,如果您不介意,并且能够静态分析数据结构,只需对PHP代码执行tokenize或parse操作,并查看T_DOUBLE_ARROW是否在数组值之前。这可能不值得努力,并且只适用于静态代码。
发布于 2014-12-10 23:40:05
您可以使用以下命令遍历数组
foreach($a as $key => $value) {
/* stuff */
}要检查键是否已显式设置,可能只能通过检查键是否为数字来完成(PHP将为数组中没有任何键的值分配数字键)。当然,这意味着您将无法检测到显式设置的数字键。
因此,除非有一些函数(我不知道),否则这将是唯一的方法。
https://stackoverflow.com/questions/27404906
复制相似问题