将数组分组为2个元素的子数组,最后一组丢失

时间:2014-10-25 00:20:08

标签: php arrays loops

我从数据库中获取数据并返回6行。我循环遍历它们将它们添加到一个临时数组然后每2次迭代我将它们添加到父数组中,这样我就知道有一个数组,子数组按2分组。下面,如你所见,我回显每次迭代为6结果。我的分组数组只显示2组2,当它应该是3组2.我做错了什么?

注意:我检查了数据,前两组是正确的数据,但最后两行丢失了。

// group entries into subgroups of 2

$buffer = array();
$entries = array();

for( $i = 0; $i < $journal_entries_count; $i++ )
{

if( $i % 2 == 0 && $i > 0 )
{
    $entries[] = $buffer;

    unset( $buffer );
    $buffer = array();
}

$buffer[] = $journal_entries[ $i ];

echo $i, '<br />';

}

0
1
2
3
4
5

Array
(
[0] => Array
    (
        [0] => Array
            (
                [journal_entry_id] => 196
                [journal_entry_date] => 2014-10-24 20:01:44
                [scoring_type_id] => 1
                [score] => 2662.00
                [wod_title] => yyyyy
                [wod_date] => 2014-09-12
                [strength] => 
                [repscheme] => 
                [benchmark] => Annie
            )

        [1] => Array
            (
                [journal_entry_id] => 197
                [journal_entry_date] => 2014-10-24 20:01:44
                [scoring_type_id] => 1
                [score] => 196.00
                [wod_title] => yyyyy
                [wod_date] => 2014-09-12
                [strength] => 
                [repscheme] => 
                [benchmark] => Badger
            )

    )

[1] => Array
    (
        [0] => Array
            (
                [journal_entry_id] => 195
                [journal_entry_date] => 2014-10-24 20:00:19
                [scoring_type_id] => 1
                [score] => 300.00
                [wod_title] => Koala Bear WOD
                [wod_date] => 2014-10-21
                [strength] => 
                [repscheme] => 
                [benchmark] => Amanda
            )

        [1] => Array
            (
                [journal_entry_id] => 194
                [journal_entry_date] => 2014-10-24 20:00:19
                [scoring_type_id] => 7
                [score] => 5.20
                [wod_title] => Koala Bear WOD
                [wod_date] => 2014-10-21
                [strength] => Back Squat
                [repscheme] => 10RM
                [benchmark] => 
            )

    )

解决方案? 我还没有将它标记为解决方案,因为我不确定它是否适用于所有情况, 但是在每次迭代时都会循环,它永远不会击中最后一次。

0 =跳过 - 添加 1 =跳过 - 添加 2 =添加 - 添加 3 =跳过 - 添加 4 =添加 - 添加 5 =跳过 - 添加

我添加了$journal_entries_count + 1,结果现在正确无误。

思想?

3 个答案:

答案 0 :(得分:2)

如果$journal_entries_count为6,那么在循环结束时,$buffer将包含两行,但它不会被添加到$entries

您需要添加最终

$entries[] = $buffer;
循环后

。或者,您可以使用array_chunk

$entries = array_chunk($journal_entries, 2);

答案 1 :(得分:0)

你可以尝试使用一些更简单的代码,看看你是怎么做的。

$entries = array();

$journal_entries[] = 1;
$journal_entries[] = 2;
$journal_entries[] = 3;
$journal_entries[] = 4;
$journal_entries[] = 5;

while (count($journal_entries)){

    $entries[] = array_slice($journal_entries,0,2);
    $journal_entries = array_slice($journal_entries,2);

}

print_r($entries);

答案 2 :(得分:0)

您缺少最后两个条目,因为您没有从最后一个循环中添加缓冲区。

您需要更新代码,在foreach循环之后,检查缓冲区是否为空。如果它不为空,则将其添加到最终数组中。

你说$ journal_entries_count + 1它可以工作,因为你实际上再次运行循环并从&#34; true&#34;添加最终缓冲区。最后一个循环。

结束代码应该是这样的:

$buffer = array();
$entries = array();

for( $i = 0; $i < $journal_entries_count; $i++ ) {
    if( $i % 2 == 0 && $i > 0 ) {
        $entries[] = $buffer;
        unset( $buffer );
        $buffer = array();
    }
    $buffer[] = $journal_entries[ $i ];
    echo $i, '<br />';
}
// add any leftover buffer data
if(count($buffer) > 0) {
    $entries[] = $buffer;
}