我的问题没有找到任何答案。 我知道如何在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,但我认为这不是我需要的。
答案 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) {}
修改强>
答案 3 :(得分:0)
您可以使用:array_keys和array_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
}
}