Комбинации массивов PHP


person Psytronic    schedule 18.11.2009    source источник
comment
Почему именно 1x и 1y неверны?   -  person Ikke    schedule 18.11.2009
comment
@Ikke: потому что он не содержит ничего из второго элемента массива, то есть a, b или c. @Bart: Извините, я должен был объяснить ситуацию немного лучше, однако я нахожусь в той же ситуации, что и ОП связанного поста, но еще немного изменил вопрос, чтобы, надеюсь, отразить это.   -  person Psytronic    schedule 18.11.2009
comment
Я уже читал другой пост, но на мои вопросы он не ответил. Вот почему я спросил. Так что позвольте мне спросить еще раз, но теперь с примером. Можете ли вы объяснить, какие комбинации вы ищете, когда ваш массив выглядит так: $array = array(array('1', '2'), array('a', 'b', 'c'), array('m', 'n'), array('x', 'y')); Пожалуйста, старайтесь избегать таких терминов, как и т. д., перечислите все комбинации, пожалуйста.   -  person Bart Kiers    schedule 18.11.2009
comment
Ах, ладно, нет проблем, я занимаюсь интеллектуальным анализом данных по отслеживанию, которое наш сайт выполняет при перемещении наших пользователей по всему веб-сайту, я объединил все данные и получил массив, состоящий из x количества кликов, которые пользователь делает на нашем сайте. сайт, а также самые популярные элементы, на которые они нажимали (кнопки, входные данные, ссылки) на этом этапе путешествия. Теперь мне нужно извлечь из этого шаблоны, проработав каждую возможную комбинацию, которую человек мог бы извлечь из этих результатов. Надеюсь, это поможет?   -  person Psytronic    schedule 18.11.2009
comment
Psytronic, кому ты тут отвечаешь? Я предполагаю, что это не я... Если да, то вы вообще не ответили на мой вопрос. Какой вывод вы хотели бы получить для массива: $array = array(array('1', '2'), array('a', 'b', 'c'), array('m', 'n'), array('x', 'y'));   -  person Bart Kiers    schedule 18.11.2009
comment
Извините, на основе этого массива это то, что мне нужно: , '1b', '1bm', '1bn', '1bmx', '1bmy', '1bnx', '1bny', '1c', '1cm', '1cn', '1cmx', '1cmy', ' 1cnx", "1cny", "2a", "2am", "2an", "2amx", "2amy", "2anx", "2any", "2b", "2bm", "2bn", "2bmx" , '2bmy', '2bnx', '2bny', '2c', '2cm', '2cn', '2cmx', '2cmy', '2cnx', '2cny' );   -  person Psytronic    schedule 19.11.2009
comment
Итак, одиночный 2 следует опустить? Почему? Что, если первый массив содержит, скажем, 4 элемента?   -  person Bart Kiers    schedule 19.11.2009
comment
Err 2 должен был быть там, я, должно быть, пропустил это. Если бы первый элемент доходил до 4, то он повторялся бы с 3 и 4 вместо 1 и 2 с   -  person Psytronic    schedule 20.11.2009


Ответы (3)


Используя подход Джоша Дэвиса в ответе на связанный вопрос:

    $array = array( array('1', '2'), 
                    array('a', 'b', 'c'), 
                    array('m', 'n'), 
                    array('x', 'y'));

    $result = array();
    $php = 'list($a' . implode(',$a', array_keys($array)) . ')=$array;';
    $close_brakets='';
    $r='';
    foreach($array as $k => $v)
    {
        $r .= '$v'.$k;
        $php.='foreach($a'.$k.' as $v'.$k.'){ $result[]="'.$r.'";';
        $close_brakets.="}";
    }

    $php .= $close_brakets;

    eval($php);

    print_r($result);

дает вам желаемые комбинации

person danii    schedule 19.11.2009
comment
Спасибо, должно быть, я не пробовал этот код, мне действительно удалось взять мой текущий код и изменить его в конце, однако это тоже работает :) - person Psytronic; 20.11.2009

Что-то вроде этого? Идея состоит в том, чтобы зациклить один массив и объединить его с каждым значением в другом массиве.

// Loop array[0].
for($i=0; $i<count($array[0]); $i++) {
    // Loop array[1]
    for($j=0; $j<count($array[1]); $j++) {
        echo $array[0][$i];
        echo $array[1][$j];
    }
}
person Kristoffer Bohmann    schedule 18.11.2009
comment
Я сомневаюсь, что массив(ы) будет иметь фиксированную длину. - person Bart Kiers; 18.11.2009

Что ж, взяв код, который я изначально использовал, это то, что я придумал, на всякий случай, если кому-то еще любопытно.

$patterns_array = array();

$php = '';
foreach ($patterns as $i = > $arr)
{
    $php .= 'foreach ($patterns[' . $i . '] as $k' . $i . ' => $v' . $i . '){';
    $tmp = array();
    for($ii=1; $ii<=$i; $ii++){
        $tmp[] = $ii; 
    }
    $php .= '$patterns_array[] = $v'.implode('."::".$v', $tmp).';';
}

$php .= '$patterns_array[] = $v' . implode('."::".$v', array_keys($patterns)) . ';' . str_repeat('}', count($patterns));

eval($php);
person Psytronic    schedule 20.11.2009