Странное поведение с foreach () с PHP \ array_rand (x, y) - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь случайным образом назначить атрибуты сущности, выбрав k элементов из вектора n элементов. При запуске приведенного ниже фрагмента иногда он работает, иногда он дает эту странную ошибку с foreach

InvalidForeachArgumentException: Invalid argument supplied for foreach()

Я читал о нескольких сообщениях о странном поведении с foreach, когда переменная передается по ссылке, и может быть необходимо отключить его, но, похоже, это не связано с этим, поскольку я не использую здесь никаких ссылок. Забавно то, что если я не генерирую $ factor с помощью генератора случайных чисел, а устанавливаю его на постоянное целочисленное значение, код просто работает. Я не совсем уверен, что здесь происходит.

$factor = PseudoRandom\int(
          1,
          $num
        );

        $capabilities = vec[];
        $random_keys = PHP\array_rand(
          $temp,
          $factor, 
        );

        foreach ($random_keys as $key) {
          $capabilities = Vec\append(
            $capabilities,
            $temp[$key],
          );
        }

1 Ответ

2 голосов
/ 18 июня 2020

При выборе только одной записи array_rand() возвращает ключ для случайной записи. В противном случае возвращается массив ключей для случайных записей.
https://www.php.net/array_rand

Итак, когда $factor оказывается 1, возвращается только один ключ, который нельзя перебирать с помощью foreach.

...