2014-01-10 5 views
0

У меня есть массив, который исходит из формы POST, и я хотел бы сгруппировать их вместе.Использование полей формы для создания массивов PHP

Моя первая попытка - запустить цикл foreach в массиве, но я не понимаю, как логически их группировать. У меня есть идея создать динамический массив, используя число из ключей, но я не могу захватить это число.

Начальный массив:

["affix-1-order"]=> "1"; 
["affix-1-type"]=> "Apple"; 
["affix-1-count"]=> "5"; 
["affix-3-order"]=> "2"; 
["affix-3-type"]=> "Orange"; 
["affix-3-count"]=> "10"; 
["affix-2-order"]=> "3"; 
["affix-2-type"]=> "Banana"; 
["affix-2-count"]=> "3"; 
["affix-4-order"]=> "4"; 
["affix-4-type"]=> "Mango"; 
["affix-4-count"]=> "15"; 

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

["1"]=> [{ 
    ["type"]=> "Apple", 
    ["count"]=> "5", 
    ["order"]=> "1" 
}], 
["2"]=> [{ 
    ["type"]=> "Banana", 
    ["order"]=> "3", 
    ["count"]=> "3" 
}], 
["3"]=> [{ 
    ["type"]=> "Orange", 
    ["order"]=> "2", 
    ["count"]=> "10", 
}], 
["4"]=> [{ 
    ["type"]=> "Mango", 
    ["order"]=> "4", 
    ["count"]=> "15" 
}]; 
+2

вы могли бы построить свою форму таким образом, чтобы вы получили нужный массив в пост без каких-либо манипуляций на последнем –

+0

я не понимаю? Как вы предлагаете мне группировать ключ и 3 значения в форме ввода? – veksen

+0

'name = X [] ['type']' 'name = X [] ['order']' 'name = X [] ['count']', массив post X будет тем, что вы хотите –

ответ

2

Я предпочел бы последовать совету Дагона и изменить форму или запрос Ajax, который отправляет данные.

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

<?php 
if(count($_POST)) 
{ 
    print_r ($_POST['data']); 
    die(); 
} 
?> 

<body onload='document.getElementById("post").submit();'> 
    <form method="POST" id="post"> 
     <input type='text' name='data[0][type]' value='Apple'> 
     <input type='text' name='data[0][count]' value='5'> 
     <input type='text' name='data[0][order]' value='1'> 
     <input type='text' name='data[1][type]' value='Banana'> 
     <input type='text' name='data[1][count]' value='3'> 
     <input type='text' name='data[1][order]' value='3'> 
     <input type='text' name='data[2][type]' value='Orange'> 
     <input type='text' name='data[2][count]' value='2'> 
     <input type='text' name='data[2][order]' value='10'> 
     <input type='text' name='data[3][type]' value='Mango'> 
     <input type='text' name='data[3][count]' value='4'> 
     <input type='text' name='data[3][order]' value='15'> 
    </form> 
</body> 

выход

[0] => Array 
     [type] => Apple 
     [count] => 5 
     [order] => 1 
[1] => Array 
     [type] => Banana 
     [count] => 3 
     [order] => 3 
[2] => Array 
     [type] => Orange 
     [count] => 2 
     [order] => 10 
[3] => Array 
     [type] => Mango 
     [count] => 4 
     [order] => 15 
+0

Не читал достаточно, чтобы видеть, что это происходит из формы «POST». Это был бы лучший вариант. – Sam

+0

@SamSullivan OTOH мое решение не соответствует регулярным выражениям :) –

+0

Я не знал, что это возможно ... спасибо, вы только что спасли мне часы работы :) – veksen

3
$array = array(
    "affix-1-order" => "1", 
    "affix-1-type" => "Apple", 
    "affix-1-count" => "5", 
    "affix-3-order" => "2", 
    "affix-3-type" => "Orange", 
    "affix-3-count" => "10", 
    "affix-2-order" => "3", 
    "affix-2-type" => "Banana", 
    "affix-2-count" => "3", 
    "affix-4-order" => "4", 
    "affix-4-type" => "Mango", 
    "affix-4-count" => "15", 
); 

$final = array(); 
foreach($array as $key => $value) { 
    preg_match('/affix\-([\d]+)\-(.*)/', $key, $matches); 
    // $matches[0] = 'affix-1-order'; 
    // $matches[1] = '1'; 
    // $matches[2] = 'order'; 

    $final[$matches[1]][$matches[2]] = $value; 
} 

print_r($final); 
// Array (
// [1] => Array ([order] => 1 [type] => Apple [count] => 5) 
// [3] => Array ([order] => 2 [type] => Orange [count] => 10) 
// [2] => Array ([order] => 3 [type] => Banana [count] => 3) 
// [4] => Array ([order] => 4 [type] => Mango [count] => 15) 
//) 
+0

Я закончил чтобы изменить форму, но это блестящее решение, спасибо! :) – veksen

+0

Нет проблем @veksen, изменение формы - гораздо лучшее решение. Но всегда полезно узнать немного регулярного выражения;) – Sam

+1

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

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