Итак, сначала вопрос, сколько комбинаций есть? И ответ заключается в том, что вам нужно умножить количество каждого массива друг на друга.
So (c = amount1):
carray 1 * carray 2 * ... * carray n
blockquote>И конкретный для вашего примера:
carray 1 * carray 2 * carray 3 = 2 * 2 * 2 = 8
blockquote>* 1 И если вы задаетесь вопросом, почему я выбрал c для суммы, из-за функции count () в php
Получение всех комбинаций вместе
Как мы получите все комбинации с количеством массивов, которые у нас есть?
Пролистываем все наши комбинации, которые у нас уже есть (начиная с одной комбинации, «пустая комбинация» (
$combinations = [[]];
)) , и для каждой комбинации мы переходим через наш следующий массив данных и объединяем каждую комбинацию с каждым входным данным в новую комбинацию.Теперь мы делаем это, пока не получим желаемую длину для каждой комбинации.
Итак, в качестве примера:
Array with the elements (Empty array is '[]'): [ [1, 2], [3, 4] ]
//↓ new combinations for the next iteration │ array NAN*: Combinations: - [] │ -> [] │ array 1 [1,2]: ┌─────────────┤ │ │ Combinations: v v - [] + 1 │ -> [1] - [] + 2 │ -> [2] │ array 2 [3,4]: ┌─────────────┤ │ │ Combinations: v v - [] + 3 │ -> [3] - [] + 4 │ -> [4] - [1] + 3 │ -> [1,3] //desired length 2 as we have 2 arrays - [1] + 4 │ -> [1,4] //desired length 2 as we have 2 arrays - [2] + 3 │ -> [2,3] //desired length 2 as we have 2 arrays - [2] + 4 │ -> [2,4] //desired length 2 as we have 2 arrays //↑ All combinations here
* NAN: не число
Итак, как вы можете видеть в выше, мы теперь имеем все комбинации с длиной количества всех массивов, которые у нас есть.
. Но чтобы получить только комбинации с нужной длиной, мы переписываем массив результатов на каждую итерацию, так что на end, только комбинации с ожидаемой длиной находятся в массиве результатов.
Код:
Выход<?php $array1 = array(1,2); $array2 = array(4,5); $array3 = array(7,8); $combinations = [[]]; $data = [ $array1, $array2, $array3, ]; $length = count($data); for ($count = 0; $count < $length; $count++) { $tmp = []; foreach ($combinations as $v1) { foreach ($data[$count] as $v2) $tmp[] = array_merge($v1, [$v2]); } $combinations = $tmp; } print_r($combinations); ?>
:
Array ( [0] => Array ( [0] => 1 [1] => 4 [2] => 7 ) //... [7] => Array ( [0] => 2 [1] => 5 [2] => 8 ) )
Для ассоциативных массивы, вам нужно сделать лишь небольшую модификацию:
- Сначала назначьте ключи массивов переменной
array_keys()
, например$keys = array_keys($data);
- Используйте клавиши во втором цикле foreach для доступа к массиву данных, значит: от
до:foreach ($data[$count] as $v2)
foreach ($data[$keys[$count]] as $v2)
Единственный способ, которым это могло бы произойти в этом коде, - это если циклу for нечего перебирать. Это будет означать, что оператор if никогда не выполняется, а user_new
никогда не определяется.
Убедитесь, что в accuracy.txt
есть хотя бы одна строка, иначе цикл никогда не запустится, поскольку нет строк, через которые можно пройти.
Если отсутствие строк в текстовом файле неизбежно, рассмотрите возможность проверки длины файла с помощью чего-нибудь такого, как:
if search.read() == "":
user_new = False
Время от времени проблема была accuracy.txt
пустой, из-за чего цикл никогда не выполнялся и user_new
никогда не определялся. Спасибо @Joe Allen за ответ.