Php ForEach只执行一次任务

Php ForEach只执行一次任务,php,arrays,twitter,foreach,Php,Arrays,Twitter,Foreach,我有一个数组,它是从twitter API检索到的一些数据的json_解码。 以下是我正在使用的数组的部分: Array( [0]=>stdClass Object ( [user] => stdClass Object ( [screen_name] => User1 ) [text] => Text of message [id] => 220301332135952

我有一个数组,它是从twitter API检索到的一些数据的json_解码。
以下是我正在使用的数组的部分:

Array(
    [0]=>stdClass Object (
        [user] => stdClass Object (
            [screen_name] => User1
        )
        [text] => Text of message
        [id] => 220301332135952385
        [created_at] => Tue Jul 03 23:41:45 +0000 2012
    )

    [1]=>stdClass Object (
        [user] => stdClass Object (
            [screen_name] => User2
        )
        [text] => Text of message
        [id] => 220301332135952385
        [created_at] => Tue Jul 03 23:41:45 +0000 2012
    )
)
我遇到的问题是,我的PHP只从中获取
User1
消息文本的值。我的实际数组要长得多,但它遵循上述模式。
以下是我的PHP:

foreach($tweet as $num => $val) {
  $username = $tweet[$num]->user->screen_name;
  echo $num . "-USER-" . $username . "-NAME ";
  $tweet = $tweet[$num]->text;
  $id = $tweet[$num]->id_str;
  $year = substr($tweet[$num]->created_at, -4);

  $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$tweet', '$id', '$year')");
  $statement->execute();
}
$tweet
是我的数组。里面的
echo
是我用来调试的东西。它输出:

1-USER-User1-NAME 2-USER--NAME 3-USER--NAME
我期待着:

1-USER-User1-NAME 2-USER-User2-NAME

最后,我的数据库只接收用户名列中的
User1
,以及tweet列中的
消息文本。不会在id或年份中插入任何内容。尽管如此,它还是会在第一条tweet之后为每条tweet创建空行。不知道我做错了什么。任何帮助都将不胜感激。谢谢

如果您尚未解决此问题,下面是发生的情况:

foreach
循环的第三行,您正在替换
$tweet
的值,这就是为什么您在数据库中只看到第一个用户的
用户名和
tweet
。您没有获得“id”和“year”的原因是
tweet
之后现在变成了
$tweet[$num]->text
,这是一个字符串

另一个问题是在您的
$id=$tweet[$num]->id\u str
中。由于上述原因,这无论如何都不起作用,但一旦解决了上述问题,
$id
仍将为空

请尝试以下操作:

foreach($tweet as $num => $val) {
  $username = $tweet[$num]->user->screen_name;
  echo $num . "-USER-" . $username . "-NAME ";
  $user_tweet = $tweet[$num]->text; // Use $user_tweet = ... instead of $tweet = ...
  $id = $tweet[$num]->id; // Replace $id_str with $id
  $year = substr($tweet[$num]->created_at, -4);

  $statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES ('$username', '$user_tweet', '$id', '$year')");
  $statement->execute();
}
我不知道你为什么选择使用
$tweet[$num]
而不是
$val

另外,为了在代码中充分利用准备好的语句,建议使用准备好的参数化查询,如下所示(以下是原因“”):


尝试调试,删除foreach循环中的所有内容,并测试foreach在另一个foreach中的print_r($tweet)@FaceOfJock。我在第一个foreach中有一个打印。我这么说是因为你的$tweet大小为3,而你只显示了2个对象的数组,所以可能你在第二个foreach中有问题,请尝试添加另一个打印并向我显示结果,谢谢。我没有意识到我两次使用$tweet作为变量。非常感谢!
$statement = $connect->prepare("INSERT INTO table (username, tweet, id, year) VALUES (:username, :user_tweet, :id, :year)");
$statement->bindParam(':username', $username);
$statement->bindParam(':user_tweet', $user_tweet);
$statement->bindParam(':id', $id);
$statement->bindParam(':year', $year);
$statement->execute();