Как создавать комбинации в пользовательском массиве из многомерного массива в php

Я новичок в массивах. На самом деле я хочу создать один настраиваемый массив из многомерного массива. У меня есть такие массивы, как это: -

Array
(
[0] => Array
    (
        [0] => 30
        [1] => 31
    )

[1] => Array
    (
        [0] => 4
        [1] => 5
        [2] => 32
    )

[2] => Array
    (
        [0] => 29
    )

)
$filterids = $getfilterids; // that is saved in one variable.

Прямо сейчас есть только три массива, может быть, в будущем будет больше, значит, будет любое количество массивов. Итак, я хочу создавать комбинации с другим массивом элементов, а после этого нужно взорвать запятую (,). Теперь я хочу вывести что-то вроде этого: -

Array
(
    [0] => 30,4,29
    [1] => 30,5,29
    [2] => 30,32,29
    [3] => 31,4,29
    [4] => 31,5,29
    [5] => 31,32,29
)

Я искал, но не могу начать. Пожалуйста, помогите мне, как я могу реализовать этот тип функций. Примечание: - Массивы можно и больше, он должен быть динамическим. Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
280
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Надеюсь это поможет

foreach ($filterids as $val) {
    $new_val[] = implode(',', $val);
}
print_r($new_val);

$filterids будет многомерным массивом.

Выход: https://eval.in/1053282

Вы думаете, что это правильно? Вы тестировали -1 от меня?

kunal 03.09.2018 07:30

Да, пожалуйста, проверьте ссылку

Vamsi 03.09.2018 07:32

пожалуйста, проверьте мой ожидаемый результат

kunal 03.09.2018 07:33
Ответ принят как подходящий

Наконец поищите в Google. Наконец я нашел решение. Надеюсь, это поможет кому-то в будущем: -

function combinations($arrays, $i = 0) {    
    if (!isset($arrays[$i])) {
        return array();
    }
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }
    $tmp = combinations($arrays, $i + 1);
    $result = array();
    foreach ($arrays[$i] as $v) {
        foreach ($tmp as $t) {
            $result[] = is_array($t) ? 
                implode(',',array_merge(array($v), $t)) :
                implode(',',array($v,$t));
        }
    }
    return $result;
}

$result = combinations($filterids);   // call the function
echo "<pre>"; print_r($result);    // echo the expected output 
    function combine($arr){
        $ret = array_pop($arr);
        for($i = count($arr) - 1; $i >= 0; $i--){
            $ret2 = [];
            foreach ($arr[$i] as $ar){
                foreach ($ret as $rt){
                    $ret2[] = $ar . "," . $rt;
                }
            }
            $ret = $ret2;
        }
        return $ret;
    }
    combine($filtered);

O (nm ** 2) n - длина массива, m - длина его самого длинного элемента

Пожалуйста, проверьте мой ожидаемый результат ... мне нужна комбинация других элементов массива

kunal 03.09.2018 08:48

Вы можете начать думать об этой проблеме как о «декартовом произведении» массивов во входных данных и затем применить функцию форматирования к декартову произведению. Алгоритмы декартовых произведений хорошо известны, вы можете посмотреть здесь для справки: https://rosettacode.org/wiki/Cartesian_product_of_two_or_more_lists

Я предлагаю использовать универсальную функцию «декартово произведение», которую вы можете повторно использовать в своем коде.

Вот предлагаемое решение:

<?php
$input = Array
(
0 => Array
    (
        0 => 30,
        1 => 31
    ),

1 => Array
    (
        0 => 4,
        1 => 5,
        2 => 32
    ),

2 => Array
    (
        0 => 29
    )

);


$expected = Array
(
    0 => "30,4,29",
    1 => "30,5,29",
    2 => "30,32,29",
    3 => "31,4,29",
    4 => "31,5,29",
    5 => "31,32,29"
);

//make an intermediate array with the cartesian product of the $input array

$intermediate = cartesian($input);

// and then apply the "implode" function to format the output as requested.

$output = array_map(function($v) {
    return implode(",", $v);
}, $intermediate);


var_dump($output);

if ( ($output === $expected)) {
    echo "output is equal to expected" .PHP_EOL;
} else {
    echo "not equals" .PHP_EOL;
}


function cartesian($input) {
    $result = array(array());

    foreach ($input as $key => $values) {
        $append = array();

        foreach($result as $product) {
            foreach($values as $item) {
                $product[$key] = $item;
                $append[] = $product;
            }
        }

        $result = $append;
    }

    return $result;
}

который производит этот вывод:

array(6) {
  [0]=>
  string(7) "30,4,29"
  [1]=>
  string(7) "30,5,29"
  [2]=>
  string(8) "30,32,29"
  [3]=>
  string(7) "31,4,29"
  [4]=>
  string(7) "31,5,29"
  [5]=>
  string(8) "31,32,29"
}
output is equal to expected

Другие вопросы по теме