2013-10-05 2 views
1

Я хотел бы, чтобы включить следующую строку в массив:Turn строки в многомерный массив с помощью регулярных выражений

Prijs = 0,209 & OrderBy = цена & порядка = неопределенный & posts_per_page = неопределенный

INTO

array(
    [prijs] => Array 
     (
      [0] => 0 
      [1] => 209 
     ) 
    [orderby] => Array 
     (
      [0] => price 
     ) 
    [order] => Array 
     (
      [0] => undefined 
     ) 
    [posts_per_page] => Array 
     (
      [0] => undefined 
     ) 
) 

Нечто подобное. Это возможно?
Теперь я использую петли foreach, но это не так быстро и идеально, как RegEx.
Это сценарий, который нужно загружать как можно быстрее, поэтому каждый бит улучшения кода может помочь.

Количество массивов может быть переменной. Но он всегда будет на 2 уровня глубоким, как и выше. И только один главный массив.

+1

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

+0

Я не могу опубликовать свой полный код, потому что это более 300 строк :) Это модуль фильтрации, который использует слишком много циклов foreach для получения желаемых результатов ... Вот почему это слишком медленно и Я ищу решения для замены как можно большего числа циклов с помощью другого кода. –

+0

в этом случае звучит так, будто перетащить может быть и из другого места, но вы можете публиковать соответствующие части в любом случае (и вам нужно) –

ответ

1
$str = 'prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined'; 

$array = preg_split('/[&]/' , $str); 

foreach ($array as $a) 
{ 
    $a = preg_split('/[=]/' , $a); 
    $a[1] = preg_split('/[,]/' , $a[1]); 
} 

var_dump($array); 
+0

Несмотря на то, что я искал решение без foreach, это улучшение, потому что ваше решение просто использует 1 foreach, а затем мое более раннее решение с двумя предубеждениями. Так что спасибо :) –

+0

, если вас беспокоит производительность, вы также должны отметить 2 вызова функций внутри foreach –

+0

Это не делает то, что вы думаете. http://3v4l.org/89v3g – vascowhite

1

Ну, вы можете использовать что-то вроде этого:

<?php 
    parse_str("prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined",$myArray); 
    $myArray['prijs'] = explode(",", $myArray['prijs']); 
    $myArray['orderby'] = explode(",", $myArray['orderby']); 
    $myArray['order'] = explode(",", $myArray['order']); 
    $myArray['posts_per_page'] = explode(",", $myArray['posts_per_page']); 
    print_r($myArray); 
    ?> 
+0

Это не способ сделать это, потому что у нас есть порядок, порядок, но также филиалы и т. Д. –

+0

@ErikVandeVen: В соответствии с вашим вопросом, я дал вам ответ. вы должны были упомянуть об этом, если бы вам пришлось рассмотреть и другие варианты. – aaron

+2

@ErikVandeVen: Пожалуйста, отредактируйте этот вопрос и укажите ваши точные требования и опубликуйте свой запрошенный код. Это поможет нам лучше ответить на ваш вопрос. –

0
function urlSplitter($input) 
{ 
    $step1Array = explode('&', $input); 
    $result = array(); 

    foreach($step1Array as $element) 
    { 
     $parts = explode("=", $element); 
     $result[$parts[0]] = explode(",", $parts[1]); 
    } 

    return $result; 
} 

$result = urlSplitter("prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined"); 
var_dump($result); 
+0

Спасибо за ваш ответ, но, как я писал в своем первом посте, я ищу способ использовать меньше предубеждений, тогда я уже используя :) –

+0

хорошая точка, но есть ли какая-то особая причина, почему вы не любите foreach? Нужно ли поддерживать минимальное количество строк? – Programster

+0

может быть потому, что петли медленны при обработке больших данных. –

3

Вам не нужно Regex для этого. Строка, показали, выглядит как строка URL запроса, в этом случае $ _GET будет уже держать значение, нужно: -

var_dump($_GET); 

должен дать вам: -

array (size=4) 
    'prijs' => string '0,209' (length=5) 
    'orderby' => string 'price' (length=5) 
    'order' => string 'undefined' (length=9) 
    'posts_per_page' => string 'undefined' (length=9) 

В противном случае вы можете использовать parse_string() ,

$values = array(); 
parse_str('prijs=0,209&orderby=price&order=undefined&posts_per_page=undefined', $values); 
var_dump($values); 

Выход:

array (size=4) 
    'prijs' => string '0,209' (length=5) 
    'orderby' => string 'price' (length=5) 
    'order' => string 'undefined' (length=9) 
    'posts_per_page' => string 'undefined' (length=9) 
+0

Спасибо за ваш комментарий! Не думал об этом! Но на данный момент я использую AJAX и отправляю строку с помощью POST на страницу AJAX. На данный момент мы перестраиваем его на статический PHP, поэтому я буду помнить об этом! –

+1

@ErikVandeVen См. Мое редактирование. – vascowhite

+1

Это похоже на приятное решение, кроме того, что он не разбивает элементы на подмножества массивов. т. е. prijs = array (0, 209) – Programster

2

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

, как vascowhite предложил вы можете использовать $_GET, если у вас есть это или parse_str(), чтобы получить первоначальный array, после чего:

array_walk($array, function(&$n) { 
    $n = explode(',', $n); 
}); 

Живой код: http://3v4l.org/YfuKs

Результаты в точности то, что вы хотите (всегда имея массивы вместо CSV-строк):

Array 
(
    [prijs] => Array 
     (
      [0] => 0 
      [1] => 209 
     ) 

    [orderby] => Array 
     (
      [0] => price 
     ) 

    [order] => Array 
     (
      [0] => undefined 
     ) 

    [posts_per_page] => Array 
     (
      [0] => undefined 
     ) 

) 

PS: вместо explode() вы можете использовать preg_split('/,/', $n), так как вы упомянули RegEx и посмотрите, какой из них быстрее для вас

+0

Я был заинтригован array_walk, так как я никогда не использовал его раньше и люблю использовать закрытие. К сожалению, я нашел, что это SLOWER, чем использование foreach со ссылкой. В моем тестовом примере было умножено 10 000 элементов в массиве на 2. Это происходило как для обычного массива, так и для теста «map» – Programster

+0

- это путь, который дал вам другой вариант, даже не зная ваш код. Кстати: вы также проверили с 'preg_split()'? потому что 'explode()', как известно, медленный ... –

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