从特定键迭代php数组

时间:2014-05-15 10:36:57

标签: php arrays iterator

我的问题没有找到任何答案。 我知道如何在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)
      ...
}

我在寻找Iterator,但我认为这不是我需要的。

6 个答案:

答案 0 :(得分:4)

尝试组合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 :(得分: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一样提取想要迭代的数组。

答案 2 :(得分:1)

也许是这样的:

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

修改

Demo

答案 3 :(得分:0)

您可以使用: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 ] ];
}

答案 4 :(得分:0)

试试这个

$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];
} 

答案 5 :(得分:0)

添加为CW,因为它还不可能。

如果this pull request完成,您将能够轻松完成此操作:

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