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

zhte4eai  于 2024-01-04  发布在  其他
关注(0)|答案(6)|浏览(187)

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

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [views] => 14
  6. [timestamp] => 06/04
  7. [views_scaled] => 4.9295774647887
  8. [unix_time] => 1239022177
  9. )
  10. [1] => Array
  11. (
  12. [views] => 1
  13. [timestamp] => 19/04
  14. [views_scaled] => 0.35211267605634
  15. [unix_time] => 1240194544
  16. )
  17. ...
  18. ...
  19. ...
  20. ) 1

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

  1. $results = array_merge($results, $new_days);
  2. $a = $results;
  3. foreach ($results as $row)
  4. {
  5. $unix_time[] = $row['unix_time'];
  6. }
  7. $b = $results;

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

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

  1. array_multisort($unix_time, SORT_ASC, $results);
  2. $days = implode('|', array_pluck('timestamp', $results));
  3. $views = implode('|', array_pluck('views', $results));
  4. $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 -再多看一眼就说不出了。
这一行和后面的代码块也不会执行

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

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

xkftehaa

xkftehaa2#

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

  1. <?
  2. // set up an example array and loop through it using references (&)
  3. $my_array = array(1,2,3,4);
  4. foreach($my_array as &$item)
  5. {
  6. $item = $item+.1;
  7. }
  8. // 1st loop, $item points to: $my_array[0], which is now 1.1
  9. // 2nd, $item -> $my_array[1], which is now 2.1
  10. // 3rd, $item -> $my_array[2], which is now 3.1
  11. // 4th, $item -> $my_array[3], which is now 4.1
  12. // looping done, but $item is still pointing to $my_array[3]
  13. // next foreach loop
  14. foreach($my_array as $item)
  15. {
  16. var_dump($my_array);
  17. print $item."<br>";
  18. }
  19. // notice the & in the output of the var_dump, if you actually run this code.
  20. // 1st loop: the value of $my_array[0] is assigned to $item, which is still a pointer/reference to $my_array[3]
  21. // first loop.. array(1.1,2.1,3.1,1.1) // grabbing [0] and putting into [3]
  22. // next loop... array(1.1,2.1,3.1,2.1) // grabbing [1] and putting into [3]
  23. // next loop... array(1.1,2.1,3.1,3.1) // grabbing [2] and putting into [3] (here's where the magic happens!)
  24. // last loop... array(1.1,2.1,3.1,3.1) // grabbing [3] and putting into [3] (but [3] is the same as [2] !!!)
  25. ?>

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

展开查看全部
vd8tlhqk

vd8tlhqk3#

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

gkn4icbw

gkn4icbw4#

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

  1. <?php
  2. $a = array('bob','sam','tom','harry');
  3. $b = array();
  4. $c = array();
  5. foreach($a as $item) {
  6. $c[] = $item;
  7. }
  8. $b = $a;
  9. print_r($a);
  10. print_r($b);

字符串
得到:

  1. php ./test.php
  2. Array
  3. (
  4. [0] => bob
  5. [1] => sam
  6. [2] => tom
  7. [3] => harry
  8. )
  9. Array
  10. (
  11. [0] => bob
  12. [1] => sam
  13. [2] => tom
  14. [3] => harry
  15. )


我现在用的是PHP 5.2.8

展开查看全部
tktrz96b

tktrz96b5#

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

dwthyt8l

dwthyt8l6#

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

相关问题