2

我有一个从 MySQL 获得的数据集,如下所示:

大批
(
    [0] => 数组
        (
            [观看次数] => 14
            [时间戳] => 06/04
            [views_scaled] => 4.9295774647887
            [unix_time] => 1239022177
        )

    [1] => 数组
        (
            [观看次数] => 1
            [时间戳] => 19/04
            [views_scaled] => 0.35211267605634
            [unix_time] => 1240194544
        )

        ...
        ...
        ...

) 1

(它是后处理的,'timestamp' 之前确实是一个时间戳,但无论如何都无所谓)

数组存储在 上$results,在我的代码中间我做了这样的事情:

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

问题: $a两者$b都不同。第一个显示了应有的数组,第二个具有相同的count(),但它的第四个元素与最后一个元素重复。据我所知,我没有通过引用传递任何东西,所以$results不打算改变(也许是指针,但不是它的内容)。我在 Mac OS X 10.5.2 上使用 PHP 5.2.4。

显而易见的问题:这是某种预期的行为,错误还是我在这里做错了什么?(请不是布尔答案;)


编辑:谢谢大家的兴趣,我不知道我应该发布多少额外的代码,除了从数据库中检索数据和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:再次感谢,这是完整的片段$results数组的输出$a$b(也在代码的注释中引用)。

4

6 回答 6

3

检查您的代码片段,非常快(即将离开办公室一天),这可能与您的(第一个)循环中通过引用传递的某些内容有关。尝试按值使用 normal 并将所有内容存储到新的结果数组中。(将消除可能发生的任何谜团)。也可以尝试将第二个 foreach 中的第二个 $row 命名为不同的名称.. 打败我 - 不能告诉你更多地关注这个。

此行和以下代码块也不会执行

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

可能与它有关,新的日子永远不会填满,合并可能会做一些时髦的事情。

不会称之为答案,但我猜它是一个开始

于 2009-04-22T04:22:54.967 回答
2

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

我希望这是有道理的!基本上倒数第二个值将被重复,因为最后一个值在第二个循环期间被替换。

于 2009-04-22T12:34:36.487 回答
0

我无法想象这是如何预期的行为。这里一定有其他事情发生。你能把行为隔离到一段小到可以在这里发布的代码吗?如果你这样做,错误可能会变得很明显。

于 2009-04-22T02:13:34.373 回答
0

我还要说还有其他事情发生。

我写了这个:

<?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。

于 2009-04-22T02:41:46.723 回答
0

我认为你的问题是结果集并不是一个真正的数组,它是一个 mysql 结果集对象,它就像一个数组。

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

于 2009-04-22T03:12:18.037 回答
0

除非我弄错了,否则这是不久前的一个 PHP 错误。我不知道细节,但数组和引用已经搞砸了一点。

于 2009-04-22T04:31:44.180 回答