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 as $row)
{
    $unix_time[] = $row['unix_time'];
}
$b = $結果;

問題: $a$bは両方とも異なります。最初のものは想定どおりの配列を示し、2番目のものは同じcount()ですが、4番目の要素は最後の要素から複製されています。私が知る限り、私は参照によって何も渡していないので、$results変更するつもりはありません (おそらくポインターですが、コンテンツではありません)。Mac OS X 10.5.2 で PHP 5.2.4 を使用しています。

明らかな質問:これはどういうわけか意図した動作ですか、バグですか、それともここで何か間違ったことをしていますか? (ブール値の答えではありません;)


編集:興味を持っていただきありがとうございます。追加のコードをどれだけ投稿する必要があるか正確にはわかりません.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:ありがとうございます。ここに完全なスニペット$resultsと配列からの出力があります$a($bコードのコメントでも参照されています)。

4

6 に答える 6

3

コードスニペットを非常に迅速に検査すると (その日のオフィスを出ようとしているところです)、おそらく (最初の) ループで何かが参照渡しされている可能性があります。通常の値を使用して、すべてを新しい結果配列に格納してみてください。(起こっている可能性のある謎を取り除きます)。また、2 番目の foreach の 2 番目の $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] !!!)
?>

これが理にかなっていることを願っています!基本的に、最後の値は 2 番目のループで置き換えられるため、最後から 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

私が間違っていない限り、これはしばらく前の PHP のバグでした。詳細はわかりませんが、配列と参照が少しめちゃくちゃになっています。

于 2009-04-22T04:31:44.180 に答える