2012-05-15 5 views
4

array_chunk разбивает массив на несколько массивов, используя размер куска, чтобы сделать разрезы.В отличие от array_chunk

Что делать, если у меня есть массив массивов значений, и мне нужен только один большой массив значений?

Я мог бы использовать array_merge, но это потребовало бы, чтобы я перечислил все подмассивы, из которых может быть переменное число.

На данный момент, мое решение:

foreach($input as $tmp) {foreach($tmp as $val) { 
    ... 
}} 

Но это своего рода грязный и работает только потому, что я хочу, чтобы использовать значения. Что, если я захочу хранить массив где-нибудь?

EDIT: вход поступает из набора полей <select multiple>, используемых для выбора элементов из нескольких категорий. Каждый элемент имеет глобально уникальный (среди элементов) идентификатор, поэтому я просто хочу объединить вход в один массив и запустить его.

вход может выглядеть следующим образом:

[[4,39,110],[9,54,854,3312,66950],[3]] 

Ожидаемый результат:

[4,39,110,9,54,854,3312,66950,3] 

или:

[3,4,9,29,54,110,854,3312,66950] 
+0

вы бы 'json_encode' :) –

+1

Можете ли вы привести конкретный пример ввода и ожидаемого вывода? – deceze

+0

@MihaiIorga Я просто 'json_decode'd его хотя;) Я отредактирую с примера. –

ответ

4

поднятый из документации PHP на array_values:

/** 
* Flattens an array, or returns FALSE on fail. 
*/ 
function array_flatten($array) { 
    if (!is_array($array)) { 
    return FALSE; 
    } 
    $result = array(); 
    foreach ($array as $key => $value) { 
    if (is_array($value)) { 
     $result = array_merge($result, array_flatten($value)); 
    } 
    else { 
     $result[$key] = $value; 
    } 
    } 
    return $result; 
} 

PHP не имеет встроенного метода для сглаживания массива .. так что вы идете.

+0

Хм ... Хороший ответ, но я думаю, мне было бы лучше с точки зрения эффективности, чтобы просто сохранить то, что я делаю, по крайней мере пока. –

+0

Его ответ так же эффективен, как и ваш, просто немного больше текста, и он может выполнять несколько уровней массивов. Однако обратите внимание, что он будет перекрывать дубликаты ключей (см. Http://codepad.org/JPaFgYRt). – Zombaya

+0

Как эффективный, да, но если мне нужно выполнить цикл для обработки, это не стоит. Это отвечает на вопрос в том, что это хорошее решение для свертывания массива, но если оно используется прямо там, это просто накладные расходы. –

2

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

<?php 
echo '<pre>'; 
print_r($_POST['cat']); 
?> 
<form method="post"> 
<select name="cat[]" multiple="multiple"> 
<option value="1">1</option> 
<option value="2">2</option> 
<option value="3">3</option> 
<option value="4">4</option> 
</select> 

<select name="cat[]" multiple="multiple"> 
<option value="22">2</option> 
<option value="33">3</option> 
</select> 

<select name="cat[]" multiple="multiple"> 
<option value="111">111</option> 
<option value="222">222</option> 
<option value="333">333</option> 
<option value="444">444</option> 
</select> 
<input name="" type="submit" /> 
</form> 

Выход:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 22 
    [5] => 33 
    [6] => 222 
) 
3

Хотя PHP не имеет встроенный метод сплющить массив, вы можете достичь того же с помощью array_reduce и array_merge. Как это:

$newArray = array_reduce($array, function ($carry, $item) { 
    return array_merge($carry, $item); 
}, []); 

Это должно работать в качестве обратной операции array_chunk.

+0

Это то, что я использую, оно проще и более кратким. Это должен быть выбранный ответ. +1 –

Смежные вопросы