在PHP中检测数组的"实际"结尾

Dan*_*ugg 3 php arrays iteration comparison null

鉴于我有一个如下数组:

$array = array('a', 'b', 0, 'c', null, 'd');
Run Code Online (Sandbox Code Playgroud)

现在,我可以轻松地迭代它foreach:

foreach($array as $value){
    var_dump($value);
}
Run Code Online (Sandbox Code Playgroud)

一切都很好,很好.但是,如果我想" 查看 "以查看我是否在最后一个元素上,则以下内容将不起作用:

reset($array);
while($value = current($array)){
    var_dump($value);
    if(next($array)){
        // this won't be accurate because of the 0 element
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,所以我做了更严格的测试:

if(null !== next($array)){
    // this STILL won't be accurate because of the null element
}
Run Code Online (Sandbox Code Playgroud)

是使用for带算术偷看的索引循环的唯一解决方案吗?我不认为这可以保持关联密钥的完整性而不需要大量的闲逛.(我知道我的例子并不例证这个警告,但我换current()each(),并next()current())

有没有万无一失的方法来准确地确定数组指针是否已经移动经过阵列的端部,不管阵列元素值(null,0)

警告; 当然,使用临时变量存在大量的解决方案,但这种操作只需要肮脏和愚蠢.我很惊讶没有简洁的解决方案.


嗯,这绝不是一个完美的解决方案,因为array_keys()正在创建一个新的数组Note但是这里是:

$array = array('alpha', 'b' => 'beta', null, 'g' => 'gamma', false, 0, 'delta', null);
list($end) = array_keys(array_slice($array, -1, 1, true));
foreach($array as $key => &$value){
    // do important stuff on each element
    if($key !== $end){
        // do important stuff on all but last element
    }
}
Run Code Online (Sandbox Code Playgroud)

注意我换出了array_slice(),array_keys()因此没有创建完整的密钥副本.最初是:array_slice(array_keys($array), -1);,似乎修改在内存上会更好.


那些偶然发现的人的另一个编辑; 这些可能在类似的情况下使用:

// each returns the current element, but assigns to the referenced arguments
// the "peeked" values. they're missing checks, but it's a start.

function peek(Array &$array, &$value){
    $value = next($array);
    return prev($array);
}

function peek_key(Array &$array, &$key){
    next($array);
    $key = key($array);
    return prev($array);
}

function peek_each(Array &$array, &$key, &$value){
    next($array);
    list($key, $value) = array(key($array), current($array));
    return prev($array);
}
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 5

http://www.php.net/next
注意:您将无法区分数组的结尾和布尔FALSE元素.要正确遍历可能包含FALSE元素的数组,请参阅该each()函数.

while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
Run Code Online (Sandbox Code Playgroud)

each返回一个数组或false.这是非常独特的区别.