Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对PHP的无知或缺陷';s";foreach“;建筑_Php_Arrays_Codeigniter_Dataset_Foreach - Fatal编程技术网

对PHP的无知或缺陷';s";foreach“;建筑

对PHP的无知或缺陷';s";foreach“;建筑,php,arrays,codeigniter,dataset,foreach,Php,Arrays,Codeigniter,Dataset,Foreach,我有一个从MySQL获取的数据集,如下所示: Array ( [0] => Array ( [views] => 14 [timestamp] => 06/04 [views_scaled] => 4.9295774647887 [unix_time] => 1239022177 ) [1] => Array (

我有一个从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 $results = array_merge($results, $new_days); $a = $results; foreach ($results as $row) { $unix_time[] = $row['unix_time']; } $b = $results; 问题是:
$a
$b
都是不同的。第一个元素按预期显示数组,第二个元素具有相同的
count()
,但它的第四个元素与最后一个元素重复。据我所知,我没有通过引用传递任何内容,因此
$results
并不意味着要更改(可能是指针,但不是它的内容)。我在MacOSX10.5.2上使用PHP5.2.4

一个明显的问题是:这是某种故意的行为,一个bug还是我在这里做错了什么?(请不要回答布尔值;)
编辑:谢谢大家的关注,我不知道我应该发布多少额外的代码,我以前没有做过很多工作,只是从数据库中检索数据和a
foreach
解析时间戳并为丢失的天数构建新数组(
$new\u 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)); 数组\多排序($unix\时间,排序\ ASC,$results); $days=内爆(“|”,数组_pull('timestamp',$results)); $views=内爆(“|”,数组_pull('views',$results)); $views_SCALLED=内爆(',',数组_PULL($views_SCALLED',$results)); (
array\u pull()
是一个自定义函数,用于从典型DB转储数据集中的列生成数组)

编辑2:再次感谢,这是
$results
数组和的输出(也在代码注释中引用)。

我无法想象这是什么行为。这里一定还有别的事。您能否将行为隔离到一段足够小的代码,以便在此处发布?如果你这样做的话,这个错误可能会变得很明显。

我还想说,还有一些事情正在发生

我写道:

<?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);

不过,我运行的是PHP5.2.8。

我认为您的问题在于结果集实际上不是一个数组,而是一个mysql resultset对象,它的行为类似于数组


我认为,如果您遍历每一行,将其分配给一个新的数组,然后进行合并,它将正常工作。

非常快地检查您的代码片段(即将离开办公室一天),这可能与(第一个)循环中的引用传递有关。尝试使用normal by value并将所有内容存储到一个新的结果数组中。(将消除可能发生的任何谜团)。也可以尝试将第二个foreach中的第二个$行改为其他名称。。真是太棒了,我再也看不出来了

此外,这一行和下面的代码块也不会执行

if ($last_day != $day_before_this_one AND $last_day)
可能与此有关,新的日子将永远不会填满,合并可能会做一些时髦的事情


我不认为这是一个答案,但我想这是一个开始,除非我弄错了,这是一个PHP错误。我不知道细节,但是数组和引用已经有一点出错了。

正如前面提到的,问题是第一个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] !!!)
?>

这绝对不是您所包含代码的预期行为。而且它也不是foreach中的bug。您应该在$a=$results之间显示并使用您正在使用的确切代码;当你最终打印出$a和$b时,我的朋友,虽然听起来很奇怪,但正是这个代码。我在代码中用变量($a和$b)表示的每个点上都使用了exit(print_r())。$new_days的内容是什么,您使用什么函数来解析时间戳。我们可以看到用于获取时间戳的代码吗。在看到数组的输出之前,对数组执行的任何操作都会发生什么情况。你能把阵列的照片直接放在你展示给我们的这一部分之后吗?我已经编辑了这个问题,添加了你要求的所有内容。谢谢你的关注。在foreach之前尝试这样做,$result=array_values($results));可能是钥匙丢了。如果您直接尝试概念验证,我可以帮助您找到bug,但我太懒了,无法手动编写数组我不这么认为,因为它是从CodeIgniter的函数result_array()中检索的,合并后看起来还可以,所以在foreach循环之后问题就出现了。谢谢你,Lou,我会尝试你的建议,并让大家知道。但同时,您突出显示的那一行确实执行了,虽然不是第一次(这显然是为了避免无限循环)。它负责填充$new_days数组,该数组最终将成为$results的一部分。我在第二个foreach循环中将value变量的名称从$row更改为$row2,它工作得非常好!非常感谢你们,感谢大家的贡献。我仍然认为这确实是一个解决埃弗特建议的一些bug的方法,但是如果有人能更好地理解这种情况的内部工作原理,我很乐意阅读它。我只是没有足够的冒险精神去bugs.php.net填写TPS报告。它已经存档,状态是“伪造的”-fandelost,还有其他感兴趣的人:pdf文章写得不错,但应该更多地解释一下php变量。为php4编写,但我不认为php5中与此相关的任何变化,除了对象引用处理感谢参考Calvin!是的,np。从表面上看,这是一种违反直觉的行为,但是第三个到最后一个bug报告的评论对正在发生的事情给出了一个很好的分解。谢谢你,Josh,这确实是有道理的,我知道我理解那里发生了什么。但绝对是误导性的,而且没有适当的记录。经验法则:对通过引用传递的变量使用不同的名称(或在第二次使用之前取消设置)。
<?
// 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] !!!)
?>