Малый объем / огромное разочарование тайна: багги поведение массива в php

Так безумно! У меня есть ошибка, которая на 100% воспроизводима, это происходит всего в нескольких строках кода, но я не могу определить, в чем проблема.

Мой проект-производитель тренировок, и тайна включает в себя две функции:

  • get_pairings: это делает набор $together_pairs (легко) и $mixed_pairs (раздражает), и объединяет их в $all_pairs, используемый для тренировки.
  • make_mixed_pairs: это имеет различную логику в зависимости от того, является ли это партнер против Соло тренировки. Оба случая возвращают набор $mixed_pairs (в том же самом формате), вызываемый функцией выше.

Симптомы / подсказки:

  1. Случай solo workout прекрасен, $all_pairs будет содержать только $mixed_pairs (потому что, как это определено, $together_pairs только для партнерских тренировок)

  2. В случае партнерской тренировки, когда я объединяю два набора в get_pairings (), $all_pairs только успешно получает первый набор, который я даю ему! (Если я поменяю эти строки на Шаге 2 и сначала добавлю $together_pairs, $all_pairs будет содержать только те. Если я сначала сделаю $mixed_pairs, $all_pairs будет содержать только это).

  3. Затем, если я раскомментирую эту предпоследнюю строку в make_mixed_pairs () только для устранения неполадок, чтобы увидеть, что происходит, то $all_pairs успешно включает упражнения из обоих наборов!

Это предполагает, что проблема в том, что я делаю неправильно при создании массивов в make_mixed_pairs (), но я подтвердил, что результирующий формат идентичен в обоих случаях.

Кто-нибудь видит, что еще я могу пропустить? Я сужал этот баг в течение 4 часов до сих пор — я не могу сделать его меньше, и я не вижу, что не так 🙁

Update : я обновил цикл for В make_mixed_pairs (), чтобы остановиться на $mixed_pair_count — 1 (вместо просто $mixed_pair_count), и теперь я иногда получаю один одиночный ‘together_pair’, смешанный в результатах $all_pairs; один и тот же проклятый каждый раз, странно. Хотя это не ‘fixed’, потому что снова, когда я изменяю порядок, что я добавляю два набора в get_pairings, когда я добавляю сначала $together_pairs, то $all_pairs полностью те-это так странно…

Вот функции: first get_pairings (соответствующая часть находится прямо перед и после шага 2):

/**
* Used in make_workout.php: take the user's available resources, and return valid exercises
*/
function get_pairings($exercises, $count, $outdoor_partner_workout)      
{
// 1. Prep our variables, and put exercises into the appropriate buckets
    $mixed_exercises = array();

    $together_pairs = array();
    $mixed_pairs = array();
    $all_pairs = array();
    $selected_pairs = array();

    // Sort the valid exercises: self_pairing exercises go as they are, with extra
    // array for consistent formatting. Mixed ones go into $mixed_exercises array 
    // for more specialized pairing in make_mixed_pairs

    foreach($exercises as $exercise)
    {
        if ($exercise['self_pairing'])
        {
            $pair = array($exercise);
            array_push($together_pairs, [$pair]); 
        }
        else 
            {
                $this_exercise = array($exercise);
                array_push($mixed_exercises, $this_exercise); 
            }
    }

    // Now get the mixed_pairs 
    $mixed_pairs = make_mixed_pairs($mixed_exercises, $outdoor_partner_workout);  

// 2. combine together into one set, and select random pairs for the workout

    // Add both sets to the array of all pairs (to pick from afterward)

    $all_pairs += $mixed_pairs;
    $all_pairs += $together_pairs;

    // Now let's choose at random our desired # of pairs, and save them in $selected_pairs
    $pairing_keys = array_rand($all_pairs, $count);

    foreach($pairing_keys as $key)
    {
        array_push($selected_pairs, $all_pairs[$key]);
    }    

    // Finally, shuffle it so we don't always see the self-pairs first
    shuffle($selected_pairs);    

    return $selected_pairs;
}

А другой-make_mixed_pairs: есть два случая, первый сложный (и показывает ошибку) и второй простой (и работает):

/**
* Used by get_pairings: in case of a partner workout that has open space (where 
* one person can travel to a point while the other does an exercise til they return)
* we'll pair exercises in a special way.  (If not, fine to grab random pairs)
*/    
function make_mixed_pairs($mixed_exercises, $outdoor_partner_workout)      
{
    $mixed_pairs = array();

    // When it's an outdoor partner workout, we want to pair travelling with stationary
    // put them into arrays and then we'll make pairs using one from each
    if ($outdoor_partner_workout)
    {
        $mixed_travelling = array();
        $mixed_stationary = array();        

        foreach($mixed_exercises as $exercise)
        {
            if ($exercise[0]['travelling'])
            {
                array_push($mixed_travelling, $exercise);
            }
            else
            {
                array_push($mixed_stationary, $exercise);
            }
        }

        shuffle($mixed_travelling);
        shuffle($mixed_stationary);

        // determine the smaller set, and pair exercises that many times
        $mixed_pair_count = min(count($mixed_travelling), count($mixed_stationary));

        for ($i=0; $i < $mixed_pair_count; $i++)
        {
            $this_pair = array($mixed_travelling[$i], $mixed_stationary[$i]);

            array_push($mixed_pairs, $this_pair);  // problem is adding them here- we get only self_pairs
        }

    }    

    // Otherwise we can just grab pairs from mixed_exercises
    else 
        {
            // shuffle the array so it's in random order, then chunk it into pairs
            shuffle($mixed_exercises);
            $mixed_pairs = array_chunk($mixed_exercises, 2);
        }
    // $mixed_pairs = array_chunk($mixed_exercises, 2);  // when I replace it with this, it works

    return $mixed_pairs;
}  

1 ответ

  1. О, ради Бога: я упомянул об этом другу, который сказал мне, что union-это flukey в php, и что я должен использовать array_merge вместо этого.

    Я заменил эти строки:

    $all_pairs += $together_pairs;
    $all_pairs += $mixed_pairs;
    

    с этим:

    $all_pairs = array_merge($together_pairs, $mixed_pairs);
    

    И теперь все работает