Я новичок в массивах. На самом деле я хочу создать один настраиваемый массив из многомерного массива. У меня есть такие массивы, как это: -
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
)
Я искал, но не могу начать. Пожалуйста, помогите мне, как я могу реализовать этот тип функций. Примечание: - Массивы можно и больше, он должен быть динамическим. Заранее спасибо.






Надеюсь это поможет
foreach ($filterids as $val) {
$new_val[] = implode(',', $val);
}
print_r($new_val);
$filterids будет многомерным массивом.
Выход: https://eval.in/1053282
Да, пожалуйста, проверьте ссылку
пожалуйста, проверьте мой ожидаемый результат
Наконец поищите в 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 - длина его самого длинного элемента
Пожалуйста, проверьте мой ожидаемый результат ... мне нужна комбинация других элементов массива
Вы можете начать думать об этой проблеме как о «декартовом произведении» массивов во входных данных и затем применить функцию форматирования к декартову произведению. Алгоритмы декартовых произведений хорошо известны, вы можете посмотреть здесь для справки: 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
Вы думаете, что это правильно? Вы тестировали -1 от меня?