Переборка массивов. Как реализовать?

289
01 мая 2019, 03:40

Испытываю сложность с тем, чтобы перебрать массивы. Гуглил несколько часов напролет -- на удивление, ничего не нашел.

Суть следующая. Есть несколько массивов вида:

Array ( [2] => Array ( [n] => 1 [d] => 1 [p] => ) [3] => Array ( [n] => 2 [d] => 2 [p] => ) [4] => Array ( [n] => 3 [d] => 3 [p] => ) [5] => Array ( [n] => 4 [d] => 4 [p] => ) [6] => Array ( [n] => 5 [d] => 5 [p] => ) 
Array ( [2] => Array ( [n] => 1 [d] => 1 [p] => ) [3] => Array ( [n] => 2 [d] => 2 [p] => ) [4] => Array ( [n] => 3 [d] => 3 [p] => ) [5] => Array ( [n] => 4 [d] => 4 [p] => ) [6] => Array ( [n] => 5 [d] => 5 [p] => ) 
Array ( [2] => Array ( [n] => 1 [d] => 1 [p] => ) [3] => Array ( [n] => 2 [d] => 2 [p] => ) [4] => Array ( [n] => 3 [d] => 3 [p] => ) [5] => Array ( [n] => 4 [d] => 4 [p] => ) [6] => Array ( [n] => 5 [d] => 5 [p] => ) 

Ключ [n] -- это id.

Нам нужно перебрать все вариации id. Получить все возможные переборы.

1-1-1 1-2-1 1-3-1 1-1-2 1-1-3 1-1-4 2-2-2 ... Другими словами создать такого образа максимум переборок, чтобы впоследствии можно было уже работать с другими ключами, сравнивать их, и вообще использовать :)

Буду рад любой подсказке :) Спасибо!

Answer 1

Не очень понятен вопрос, я понял так:

$ids[1]=array_filter($arr1, function($v, $k) { return $v['n']; }); // создаем массивы из id
$ids[2]=array_filter($arr2, function($v, $k) { return $v['n']; });
$ids[3]=array_filter($arr3, function($v, $k) { return $v['n']; });
foreach($ids[1] as $v1){
    foreach($ids[2] as $v2){
        foreach($ids[3] as $v3){
            $out[$v1.'-'.$v2.'-'.$v3]=1;
        }
    }
}
echo implode('<br>',array_keys($out));
Answer 2

Подготовка всего массива, как предложил Nsk - хорошо. Но вот лучший вариант, если упретесь в ограничение размера памяти. Или если нужно остановиться, не перебирая абсолютно все. Прошу любить и жаловать: yield

// Исходные данные
$arr1 = [ ['n' => 1], ['n' => 2], ['n' => 3] ];
$arr2 = [ ['n' => 1], ['n' => 2], ['n' => 3] ];
$arr3 = [ ['n' => 1], ['n' => 2], ['n' => 3] ];
// Получение очередного ключа
function getKey($arr) {
  foreach($arr as $v) {
    // используйте это!
    yield $v['n'];
  }
}
// Получение составного ключа
function getCompositeKey($arr1, $arr2, $arr3) {
  foreach(getKey($arr1) as $v1){
    foreach(getKey($arr2) as $v2){
      foreach(getKey($arr3) as $v3){
        yield sprintf('%d-%d-%d', $v1, $v2, $v3);
      }
    }
  }
}
foreach(getCompositeKey($arr1, $arr2, $arr3) as $val) {
  echo $val . PHP_EOL;
}
READ ALSO
Ошибка call to a member function query() on a non-object in php mysqli

Ошибка call to a member function query() on a non-object in php mysqli

выскакивает ошибка call to a member function query() on a non-object

184
subquery doctrine 2

subquery doctrine 2

Есть запрос

198
Неоднозначный вызов функции класса

Неоднозначный вызов функции класса

Почему компилятор пишет

205
Одинаковы ли типы const int и int в шаблонах?

Одинаковы ли типы const int и int в шаблонах?

Почему программа выводит 00, ведь const int = int, то есть вызов идёт к одной и той же функции, а значит статическая переменная увеличится на единицу...

170