preg_match возвращает массив с дублями

195
19 декабря 2016, 19:38

Шаблон:

"(?P<name>[^/\?]+)/(?P<age>[^/\?]+)"

Данные:

"john/23"

Возвращает:

array(4) {
    ["name"]=> string(4) "john" 
    [0]=> string(4) "john" 
    ["age"]=> string(2) "23" 
    [1]=> string(2) "23" 
}

Нужно что бы в массиве не дублировались значения.

array_unique()

Для моего решения не подходит, так как данные иногда могут совпадать.

Answer 1

Вариантов несколько.

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

Второй – обработать текущий массив удалив все числовые ключи:

$newArray = array_filter($matches, function($k) {
    return !is_numeric($k);
}, ARRAY_FILTER_USE_KEY));
var_dump($newArray);

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

$newArray = explode('/', "john/23");
var_dump($newArray);
Answer 2

используйте

explode('/',$string)

вернет не ассоциативный массив вида

array (
  0 => 'josh',
  1 => 23
)
Answer 3

Регулярным выражением тут ничего не сделаешь. Как вариант можно пробежаться по массиву и сделать unset для всех элементов у которых индекс является целым числом.

Можно через банальный foreach или через array_filter

Answer 4

Есть еще вариант позволяющий сохранить структуризацию регулярного выражения за счет выноса именованных групп в блок (?(DEFINE)...), а для захваченного текста задать новые группы, которые будут помещены в результат без дублирования:

(?(DEFINE)
  (?P<name>[^\/\?]+)
  (?P<age>[^\/\?]+)
  )
((?P>name)) # group 1
\/
((?P>age))  # group 2

https://regex101.com/r/fG9lW1/1

Результат:

array(2) {
    [1]=> string(4) "john" 
    [2]=> string(2) "23" 
}
READ ALSO
Curl. Ошибка при отправке на сервер

Curl. Ошибка при отправке на сервер

Отправляю с помощью curl данные в ответ получаю:

203
vk api парсинг стран и городов

vk api парсинг стран и городов

Предо мной, стояла задача интегрировать в сайт бд стран и городовПрочел несколько статей и решил интегрировать с api в контакте

236
Вывод значений ассоциативного массива

Вывод значений ассоциативного массива

Для вывода значений массива я использую цикл foreachВ основном массиве содержатся массивы фильмов которые содержат данные о фильмах

250
Преобразование php-&gt;word-&gt;jpg

Преобразование php->word->jpg

Мне необходимо часто делать много почти одинаковых заявокОтправлять надо в jpg

208