PHP - 循环一个数组,其中只显式设置了一些键

时间:2014-12-10 15:35:32

标签: php arrays

我有以下数组

$a = ["one", "dos" => "two", "three"];

正如您所看到的那样,第二个元素的值设置明确,但其他两个项目没有。

我想遍历数组,但做一些不同的事情,这取决于是否明确设置了该项的键。有点像这样:

foreach($a as $value){
    if( has_explicit_key($value) )
        // Do something
    else
        // Do other stuff
}

我怎样才能做到这一点?

PS:我想我可以检查密钥是否是一个整数,但如果密钥明确设置为整数,那就不行了,对吗?

3 个答案:

答案 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_insertrecords no bookkeeping note of that fact

现在,如果你不介意,并且能够静态分析数据结构,只需tokenizeparse PHP代码,看看T_DOUBLE_ARROW是否在数组值之前。这可能不值得付出努力,只适用于静态代码。

答案 2 :(得分:0)

您可以使用

循环遍历数组
foreach($a as $key => $value) {
    /* stuff */
}

要检查密钥是否已明确设置,可能只能通过检查密钥是否为数字来完成(PHP会将数字键分配给数组中没有任何键的值)。 当然,这意味着您将无法检测到明确设置并且为数字的密钥。

所以,除非有一些功能(我不知道),否则这将是唯一的方法。