codeigniter 在第二个循环中重用第一个循环中的引用变量会损坏数组数据

zhte4eai  于 11个月前  发布在  其他
关注(0)|答案(6)|浏览(130)

我有一个从MySQL获得的数据集,它是这样的:

Array
(
    [0] => Array
        (
            [views] => 14
            [timestamp] => 06/04
            [views_scaled] => 4.9295774647887
            [unix_time] => 1239022177
        )

    [1] => Array
        (
            [views] => 1
            [timestamp] => 19/04
            [views_scaled] => 0.35211267605634
            [unix_time] => 1240194544
        )

        ...
        ...
        ...

) 1

字符串
(it的后处理,'timestamp'在此之前确实是一个时间戳,但这并不重要)
数组存储在$results上,在我的代码中间,我做了这样的事情:

$results = array_merge($results, $new_days);
$a = $results;
foreach ($results as $row)
{
    $unix_time[] = $row['unix_time'];
}
$b = $results;

问题:$a$b都是不同的。第一个显示的是它应该显示的数组,第二个有相同的count(),但它的第四个元素是最后一个的重复。据我所知,我没有通过引用传递任何东西,所以$results不意味着改变(也许是指针,但不是它的内容)。我在Mac OS X 10.5.2上使用PHP 5.2.4。
**一个明显的问题:**这是某种预期的行为,一个bug还是我在这里做错了什么?(请不要使用布尔答案;)
**编辑:**感谢大家的关注,我不知道我应该发布多少额外的代码,我之前没有做太多,除了从DB中检索数据和foreach来解析时间戳并为缺失的日子构建一个新数组($new_days)。这一切都很好。

这段代码是我之前发布的代码:

array_multisort($unix_time, SORT_ASC, $results);
$days = implode('|', array_pluck('timestamp', $results));
$views = implode('|',  array_pluck('views', $results));
$views_scaled = implode(',', array_pluck('views_scaled', $results));


array_pluck()是一个自定义函数,用于从典型的DB转储数据集中的列生成数组)

**编辑2:**再次感谢,这里是the full snippet$results数组$a$b的输出(也在代码的注解中引用)。

xnifntxz

xnifntxz1#

检查你的代码片段,非常快(刚要离开办公室),这可能是在你的(第一个)循环中通过引用传递的东西。尝试使用normal by value并将所有内容存储到一个新的结果数组中。(将消除任何可能正在发生的奥秘).也可以尝试使第二个foreach中的第二个$行一个不同的名称.. beats me -再多看一眼就说不出了。
这一行和后面的代码块也不会执行

if ($last_day != $day_before_this_one AND $last_day)

字符串
可能与此有关,新的日子永远不会填补,合并可能会做一些时髦的事情。
我不认为这是答案,但我想这是一个开始。

xkftehaa

xkftehaa2#

问题出在第一个foreach循环上,前面已经提到过。
原因是...

<?
// set up an example array and loop through it using references (&)
$my_array = array(1,2,3,4);
foreach($my_array as &$item)
{
  $item = $item+.1;
}
// 1st loop, $item points to: $my_array[0], which is now 1.1
// 2nd, $item -> $my_array[1], which is now 2.1
// 3rd, $item -> $my_array[2], which is now 3.1
// 4th, $item -> $my_array[3], which is now 4.1
// looping done, but $item is still pointing to $my_array[3]

// next foreach loop
foreach($my_array as $item)
{
  var_dump($my_array);
  print $item."<br>";
}
// notice the & in the output of the var_dump, if you actually run this code.
// 1st loop: the value of $my_array[0] is assigned to $item, which is still a pointer/reference to $my_array[3]
// first loop.. array(1.1,2.1,3.1,1.1) // grabbing [0] and putting into [3] 
// next loop... array(1.1,2.1,3.1,2.1) // grabbing [1] and putting into [3]
// next loop... array(1.1,2.1,3.1,3.1) // grabbing [2] and putting into [3] (here's where the magic happens!)
// last loop... array(1.1,2.1,3.1,3.1) // grabbing [3] and putting into [3] (but [3] is the same as [2] !!!)
?>

字符串
我希望这是有意义的!基本上倒数第二个值将被重复,因为最后一个值在第二次循环中被替换。

vd8tlhqk

vd8tlhqk3#

我无法想象这是什么行为。这里一定有其他的东西。你能把行为隔离到一段足够小的代码中吗?如果你这样做,bug可能会变得很明显。

gkn4icbw

gkn4icbw4#

我也会说还有别的事。
我这样写道:

<?php

$a = array('bob','sam','tom','harry');
$b = array();
$c = array();

foreach($a as $item) {
        $c[] = $item;
}
$b = $a;

print_r($a);
print_r($b);

字符串
得到:

php ./test.php
Array
(
    [0] => bob
    [1] => sam
    [2] => tom
    [3] => harry
)
Array
(
    [0] => bob
    [1] => sam
    [2] => tom
    [3] => harry
)


我现在用的是PHP 5.2.8

tktrz96b

tktrz96b5#

我认为你的问题是结果集不是一个真正的数组,它是一个mysql resultset对象,它的行为像一个数组。
我认为如果你遍历每一行,将其分配给一个新的数组,然后进行合并,它会正常工作。

dwthyt8l

dwthyt8l6#

如果我没记错的话,这是一个PHP bug,我不知 prop 体细节,但是数组和引用已经被搞砸了。

相关问题