【问题标题】:Iterate a PHP array from a specific key从特定键迭代 PHP 数组
【发布时间】:2026-01-28 02:25:01
【问题描述】:

我知道如何在 PHP 中迭代数组,但我想从特定键迭代数组。

假设我有一个巨大的数组

$my_array = array(
    ...
    ...
    ["adad"] => "value X",
    ["yy"] => "value Y",
    ["hkghgk"] => "value Z",
    ["pp"] => "value ZZ",
    ...
    ...
)

我知道从哪里开始迭代(“yy”)的。现在我只想从这个键迭代到另一个键。

我知道我不想这样做:

$start_key = "yy";
foreach ($my_array as $key => $v)
{
    if ($key == $start_key)
        ...
}

我一直在寻找迭代器,但我认为这不是我需要的。

【问题讨论】:

  • 你可以使用 next() 函数。

标签: php arrays iterator


【解决方案1】:

尝试组合 array_search、array_key 和 LimitIterator。使用 LimitIterator 页面中的示例和一些额外的位:

$fruitsArray = array(
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'cherry',
    'd' => 'damson',
    'e' => 'elderberry'
);

$startkey = array_search('d', array_keys($fruitsArray));

$fruits = new ArrayIterator($fruitsArray);

foreach (new LimitIterator($fruits, $startkey) as $fruit) {
    var_dump($fruit);
}

从位置'd'开始,输出:

string(6) "damson" string(10) "elderberry"

这种方法有一个限制,它不会在数组中循环,直到再次开始位置。它只会迭代到数组的末尾然后停止。您必须运行另一个 foreach 来执行数组的第一部分,但这可以使用我们已有的代码轻松完成。

foreach (new LimitIterator($fruits, 0, $startkey-1) as $fruit) {
    var_dump($fruit);
}

这从第一个元素开始,直到我们搜索的元素之前的元素。

【讨论】:

  • +1 用于 SPL 建议(以及我之前没有玩过的 SPL 迭代器类之一)
  • 此时您最好使用array_slice 而不是迭代器。但是 +1 作为 OP 明确要求迭代器。
  • @bwoebi: array_slice 对所有内容进行了不必要的额外复制。
  • @Jon 我认为 Iterator 变体也会进行复制,但消息来源告诉我它只是在写入时复制,所以,我的错,你是对的。
  • 但是如果你真的关心性能,也不要使用array_keys(),它会创建一个全新的数组。 (有关替代方案,请参阅我的答案)。
【解决方案2】:

foreach 总是重置数组的数组指针。你只是不能按照你想象的方式去做。

你还有几种方法。 foreach 方式只是跳过所有内容,直到您找到一次密钥:

$start_key = "yy";
$started = false;
foreach ($my_array as $key => $v)
{
    if ($key == $start_key) {
        $started = true;
    }
    if (!$started) {
        continue;
    }
    // your code
}

您也可以使用数组指针并使用while (list($key, $v) = each($array)) 方法:

$start_key = "yy";
reset($array); // reset it to be sure to start at the beginning
while (list($key, $v) = each($array) && $key != $start_key); // set array pointer to $start_key
do {
    // your code
} while (list($key, $v) = each($array));

或者,您可以像 MarkBaker proposed 那样提取要迭代的数组。

【讨论】:

  • 只有在它被封装的情况下,投反对票的人才会投赞成票 :) - eval.in/151642(只是一个假设,我不能代表她)
【解决方案3】:

可能是这样的:

foreach(array_slice(
    $my_array,
    array_search(
        $start_key,array_keys($my_array)
    ),
    null,
    true) as $key => $v) {}

Demo

【讨论】:

    【解决方案4】:

    您可以使用array_keysarray_search

    像这样:

    $keys = array_keys( $my_array ); // store all of your array indexes in a new array
    $position = array_search( "yy" ,$keys ); // search your starting index in the newly created array of indexes
    if( $position == false ) exit( "Index doesn't exist" ); // if the starting index doesn't exist the array_search returns false
    
    for( $i = $position; $i < count( $keys ); $i++  ) { // starting from your desired index, this will iterate over the rest of your array
        // do your stuff to $my_array[ $keys[ $i ] ] like:
        echo $my_array[ $keys[ $i ] ];
    }
    

    【讨论】:

      【解决方案5】:

      试试这样:

      $startkey = array_search('yy', array_keys($my_array));
      $endkey = array_search('zz', array_keys($my_array));
      
      $my_array2 = array_values($my_array);
      
      for($i = $startkey; $i<=$endkey; $i++)
      {
          // Access array like this
          echo $my_array2[$i];
      }
      

      【讨论】:

      • @Jon array_values() 使用数字键。与原始数组相比,保留了顺序。
      • @bwoebi:是的,我刚看到array_values。离开DV是因为这样还是会丢失关键信息,所以不等同于问题中显示的foreach
      • @Jon 你仍然可以获得当前元素的键值,除非它在数组中有重复。
      • 注意:要获取当前键值,请使用$key = array_search($my_array2[$i], $my_array);
      • @krishna:即便如此,您也必须对数组进行线性搜索才能找到密钥。不好。
      【解决方案6】:

      如果this pull request 成功通过,您将能够很容易地做到这一点:

      if (seek($array, 'yy', SEEK_KEY)) {
          while ($data = each($array)) {
              // Do stuff
          }
      }
      

      【讨论】: