0

これを試みるのにいくらかの困難があります。私はすべての提出物の配列をフェッチしていて、それらは次のような配列で返されています:

Array
(
    [0] => Array
        (
            [Submission] => Array
                (
                    [user_id] => 2
                    [title] => This is a test, only a test
                    [source] => http://www.testing.com
                    [slug] => this-is-a-test-only-a-test
                    [category] => misc
                    [created] => 2012-10-05 03:43:11
                    [id] => 110
                )

            [SubmissionsVote] => Array
                (
                    [0] => Array
                        (
                            [id] => 336
                            [user_id] => 2
                            [submission_id] => 110
                            [vote_type] => up
                        )

                )
                (
                    [1] => Array
                        (
                            [id] => 337
                            [user_id] => 4
                            [submission_id] => 110
                            [vote_type] => down
                        )

                )
        )
)

私の意図は、返された配列をループして、すべてのSubmissionsVoteをvote_type==upvote_type==で取得することdownです。

次に、スコアを計算します(この例では、次のようなスコアが返さ0れます:up- down。それで、そのスコアを配列に入れて、元のスコアの最後に追加して、次のようにします。

Array
(
    [0] => Array
        (
           [Submission] => Array
                (
                    [user_id] => 2
                    [title] => This is a test, only a test
                    [source] => http://www.testing.com
                    [slug] => this-is-a-test-only-a-test
                    [category] => misc
                    [created] => 2012-10-05 03:43:11
                    [id] => 110
                )

            [SubmissionsVote] => Array
                (
                    [0] => Array
                        (
                            [id] => 336
                            [user_id] => 2
                            [submission_id] => 110
                            [vote_type] => up
                        )

                )
                (
                    [1] => Array
                        (
                            [id] => 337
                            [user_id] => 4
                            [submission_id] => 110
                            [vote_type] => down
                        )

                )
        [SubmissionScore] => Array
        (
             [0] => 0
        )
        )
)

これが私が失敗したことです:

    $votes = array();
    $totalScore = array();

    foreach ($submissions as $submission) {
        $vote = $submission['SubmissionsVote'];
        array_push($votes, $vote);
    }   

    for ($i = 0; $i < count($votes); $i++) {
        $downVotes = 0;
        $upVotes = 0;

        if ($votes[$i]['vote_type'] == 'down') {
            $downVotes += 1;
        } else if ($votes[$i]['vote_type'] == 'up') {
            $upVotes += 1;
        }   

        $score = $upVotes - $downVotes;
        $totalScore = array_push($totalScore, $score);
    }

ここで正しい方向に少しプッシュしたいと思います。

4

3 に答える 3

3

これを試してください:

$newSubmissions = array();

foreach ($submissions as $submission) {
    $SubmissionsVote = $submission['SubmissionsVote'];

    foreach($SubmissionsVote as $votes) {
        $score = 0;
         if ($votes['vote_type'] == 'down') {
            $score -= 1;
        } else if ($votes['vote_type'] == 'up') {
            $score += 1;
        }   
        $submission['SubmissionScore'] = array($score);
    }
    $newSubmissions[] = $submission;

}

$submissions = $newSubmissions;
于 2012-10-07T21:32:28.000 に答える
1

ループ内で$downVotesと$upVotesを初期化しています。つまり、配列を反復処理するたびに値をオーバーライドします。

とにかく、これを単純化することができます。

foreach ($submissions as $index => $submission) {
    $up = 0;
    $down = 0;
    foreach ($submission['SubmissionsVote'] as $vote) {
        if ($vote['vote_type'] == 'up') {
            $up++;
        } else {
            $down++;
        }
    }
    $submissions[$index]['SubmissionScore'] = $up - $down;
}
于 2012-10-07T21:29:40.067 に答える
1

コードに少なくとも2つのエラーがあります:

  • SubmissionScore配列に$totalScore値を設定することはありません。
  • を追加しても機能し$votes[$i]['SubmissionScore'] = $totalScoreませんが、PHPではオブジェクトのみが参照によって渡されるため$votes、コピーのみが含まれます。

問題を解決する可能性は複数ありますが、foreachの参照は良い選択です:

foreach ($submissions as &$submission) {
    $totalScore = 0;
    foreach ($submission['SubmissionsVote'] as $vote) {
        if ($vote['vote_type'] == 'down') {
            $totalScore--;
        } else if ($vote['vote_type'] == 'up') {
            $totalScore++;
        }
    }
    $submission['SubmissionScore'] = $totalScore;
}

各提出物は、SubmissionScore賛成/反対の投票に基づくようになります。

于 2012-10-07T21:29:52.953 に答える