【问题标题】:Directly modifying array elements in foreach在foreach中直接修改数组元素
【发布时间】:2015-10-13 06:35:54
【问题描述】:

我的简单循环采用坐标和地名列表,例如:

(59.436961) (24.753575) (Revel, Estonia) (Born)
(-34.847745) (138.507362) (Port Adelaide) (Disembarked)
(-33.177085) (138.010057) (Port Pirie) (Residence before enlistment)

preg_splits 将它们放入数组 $coords,效果很好。然后我在 foreach 循环中遍历它们。我的问题是为什么会这样:

foreach ($coords as &$marker){
    $marker = preg_split('/\\) \\(|\\(|\\)/', $marker, -1, PREG_SPLIT_NO_EMPTY);
}
print_r($coords);

结果如下:

Array
(
    [0] => Array
        (
            [0] => 59.436961
            [1] => 24.753575
            [2] => Revel, Estonia
            [3] => Born
        )

    [1] => Array
        (
            [0] => -34.847745
            [1] => 138.507362
            [2] => Port Adelaide
            [3] => Disembarked
        )

    [2] => Array
        (
            [0] => -34.847745
            [1] => 138.507362
            [2] => Port Adelaide
            [3] => Disembarked
        )

)

(请注意元素 [1] 和 [2] 是相同的)- 但是:

foreach ($coords as $marker){
    $marker_array[] = preg_split('/\\) \\(|\\(|\\)/', $marker, -1, PREG_SPLIT_NO_EMPTY);
}
print_r($marker_array);

结果如下:

Array
(
    [0] => Array
        (
            [0] => 59.436961
            [1] => 24.753575
            [2] => Revel, Estonia
            [3] => Born
        )

    [1] => Array
        (
            [0] => -34.847745
            [1] => 138.507362
            [2] => Port Adelaide
            [3] => Disembarked
        )

    [2] => Array
        (
            [0] => -33.177085
            [1] => 138.010057
            [2] => Port Pirie
            [3] => Residence before enlistment
        )

)

当我尝试直接在循环中修改元素时,是否有什么我做错或不知道的事情?

【问题讨论】:

  • 使用for,而不是foreach。或者更好地使用array_walk
  • 两者的输出相同,见eval.in/403729eval.in/403728,我看不出有什么问题
  • 那么,当我将数组回显到 Javascript 中时,一定会发生一些事情 - 这个循环发生在 while 循环内,但回显发生在它之外是否很重要?
  • 如果您需要帮助,请显示更多代码。
  • foreach 循环之后直接执行unset($marker);;否则,如果您稍后在脚本中再次使用变量名称 $marker,您将面临弄乱数据的高风险。

标签: php foreach reference


【解决方案1】:

在 PHP 5.6 中,我看不到所描述的行为。你如何解析原始列表?

当我跑步时:

<?php

$coords = array('(59.436961) (24.753575) (Revel, Estonia) (Born)',
    '(-34.847745) (138.507362) (Port Adelaide) (Disembarked)',
    '(-33.177085) (138.010057) (Port Pirie) (Residence before enlistment)');

foreach ($coords as &$marker){
    $marker = preg_split('/\\) \\(|\\(|\\)/', $marker, -1, PREG_SPLIT_NO_EMPTY);
}
print_r($d);

它给了我这个:

Array
(
    [0] => Array
        (
            [0] => 59.436961
            [1] => 24.753575
            [2] => Revel, Estonia
            [3] => Born
        )

    [1] => Array
        (
            [0] => -34.847745
            [1] => 138.507362
            [2] => Port Adelaide
            [3] => Disembarked
        )

    [2] => Array
        (
            [0] => -33.177085
            [1] => 138.010057
            [2] => Port Pirie
            [3] => Residence before enlistment
        )

)

但我不推荐使用这种疯狂的结构!

如果你从文本中解析它,那么只需使用 preg_match_all 和类似这样的模式:

'~\(()\)\s*\(()\)\s*\(()\)\s*\(()\)~mu'

即使您在数组中有数据,我也强烈建议您使用preg_match 来进行可预测的数据匹配,而不是使用preg_split。但是没有人在第一天就成为大师......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2017-01-04
    • 2012-04-18
    相关资源
    最近更新 更多