有没有办法从PHP的foreach循环中的特定值开始?

时间:2015-03-10 09:04:39

标签: php arrays foreach

假设我有一个数组如下:

$my_array = array(
    "fruit1" => "apple",
    "fruit2" => "orange",
    "notfruit" => "hamburger",
    "fruit3" => "banana"
)

有没有办法在PHP的foreach循环中选择以$ my_array ['notfruit']开头?除了第一个,我不关心序列。

目前我可以考虑复制整段代码并专门为$ my_array ['notfruit']更改它,然后从数组中取消设置以使用foreach循环来完成剩余的代码。即。

echo $my_array['notfruit']."is not fruit. Who put that in the array?";
unset ($my_array['notfruit']);
foreach ($my_array as $values) {
    echo $values." is fruit. I love fruit so I like ".$values;
}

它有效,但听起来很愚蠢,如果foreach循环中的内容很长,可能会导致问题。

6 个答案:

答案 0 :(得分:2)

您可以使用不以fruit非常容易

开头的键过滤掉任何元素
$fruits = array_filter(
    $my_array,
    function ($key) {
        return fnmatch('fruit*', $key);
    },
    ARRAY_FILTER_USE_KEY
);
var_dump($fruits);

虽然使用带有此类密钥的array_filter()确实需要PHP> = 5.6

修改

对于早期版本的PHP,您可以在过滤之前swap the keys/values;然后再翻转它们

$fruits = array_flip(
    array_filter(
        array_flip($my_array),
        function ($value) {
            return fnmatch('fruit*', $value);
        }
    )
);
var_dump($fruits);

答案 1 :(得分:0)

简短回答,不。

然而,你可以将foreach中你想要的任何功能拉到一个函数中,然后专门为notfruit值调用函数,然后运行foreach。

function foo($val) {
    // do stuff with $val
}

$my_array = array(
    "fruit1" => "apple",
    "fruit2" => "orange",
    "notfruit" => "hamburger",
    "fruit3" => "banana"
)

foo($my_array['nofriut']);
unset($my_array['nofruit']);

foreach($my_array as $val) {
    foo($val);
}

修改

或者,如果您的案例与更新的问题一样简单,只需检查密钥是否为nofruit

foreach($my_array as $key => $val) {
    if($key === "nofruit") {
        echo "$val is not fruit. Who put that in the array?";
    } else {
        echo "$val is fruit. I love fruit so I like $val";
    }
} 

答案 2 :(得分:0)

试试这个..

    <?php
    $my_array = array(
        "fruit1" => "apple",
        "fruit2" => "orange",
        "notfruit" => "hamburger",
        "fruit3" => "banana"
    );
   $new_value['notfruit'] = $my_array['notfruit'];
  unset($my_array['notfruit']);
  $newarray=array_merge($new_value,$my_array);
  print_r($newarray);
    ?>

结果:Array ( [notfruit] => hamburger [fruit1] => apple [fruit2] => orange [fruit3] => banana )

答案 3 :(得分:0)

$no_fruit = $my_array['nofruit']; // grab the value
unset($my_array['nofruit']); // remove value from array
array_unshift($my_array, $no_fruit); // add value at the beginning

$no_fruit = $my_array['nofruit']; // grab the value
unset($my_array['nofruit']); // remove value from array
$my_array = array('nofruit' => $no_fruit ) + $my_array; // add value at the beginning

答案 4 :(得分:0)

您可以在数组中使用addition,这比array_unshift更高效。

所以取消设置,然后将其添加回来:

unset($my_array['notfruit']);
$my_array = array('notfruit' => 'hamburger') + $my_array;
var_dump($my_array);

或者如果你想使用变量:

$keyToMove = 'notfruit';
$val = $my_array[$keyToMove];
unset($my_array[$keyToMove]);
$newArray = array($keyToMove => $val) + $my_array;
var_dump($newArray);

显然你可以把它全部放在一个循环中,把它应用到你需要移动的任何东西上。

答案 5 :(得分:0)

选择太多了。

1。使用array_merge或array_replace(我认为这是最简单的方法)

$my_array = array_merge(['notfruit' => null], $my_array);
// $my_array = array_replace(['notfruit' => null], $my_array);

foreach ($my_array as $key => $value) {
    var_dump($key, $value);
}

2。使用发电机。

$my_array = array(
    "fruit1" => "apple",
    "fruit2" => "orange",
    "notfruit" => "hamburger",
    "fruit3" => "banana"
);

$generator = function($my_array){
    yield 'notfruit'=>$my_array['notfruit'];
    unset($my_array['notfruit']);
    foreach($my_array as $key => $value)
        yield $key => $value;
};

foreach ($generator($my_array) as $key=>$value){
    var_dump($key, $value);
}

3。读数值

$no_fruit = $my_array['nofruit']; 
unset($my_array['nofruit']); 
$my_array['nofruit'] = $no_fruit;
$my_array = array_reverse($my_array, true);

foreach ($my_array as $key=>$value){
    var_dump($key, $value);
}

4。使用不定式迭代器

$infinate = new InfiniteIterator(new ArrayIterator($my_array));
$limit_iterator = new LimitIterator(
    $infinate, 
    array_search('notfruit', array_keys($my_array)), // position of desired key
    count($my_array));

foreach ($limit_iterator as $key => $value) {
    var_dump($key, $value);
}