#php #arrays
#php #массивы
Вопрос:
У меня есть несколько массивов, и я должен выбрать только то, что находится в последней скобке. Как это сделать?
Например, некоторые мои массивы всегда похожи, но отличаются:
Array
(
[0] => 3 BUILTINUsers:(OI)(CI)(F)
)
Array
(
[0] => BUILTINUsers:(OI)(CI)(R)
)
Array
(
[0] => 22 BUILTINUsers:(OI)(CI)(R,W)
)
И я хочу получить результат из этого, например:
(F)
(R)
(R,W)
Я должен использовать substr или что?
С уважением
Комментарии:
1. Вы могли бы использовать регулярное выражение.
([^)] $
Если вы что-то пробовали, вам следует добавить это, чтобы мы могли помочь с вашей текущей проблемой.2. Нужна
([^)] )$
Ответ №1:
Вы можете сделать это просто с preg_filter
$arr = array(
'3 BUILTINUsers:(OI)(CI)(F)',
'BUILTINUsers:(OI)(CI)(R)',
'22 BUILTINUsers:(OI)(CI)(R,W)'
);
print_r(preg_filter('/^. (([^)] ))$/', '1', $arr));
Вывод
Array
(
[0] => (F)
[1] => (R)
[2] => (R,W)
)
Регулярное выражение
^
— сопоставить начало строки.
— сопоставьте что-нибудь с одним или несколькими «жадными»(...)
— Первая группа захвата(
(
буквально[^)]
сопоставьте что-нибудь «не»)
)
)
буквально
$
— сопоставить конец строки.
Итак, что это делает, так это заменяет все в каждом элементе массива, которого нет в группе захвата, на 1
— первую группу захвата. Которая должна соответствовать всему от начала последнего (
до конца этого «набора» )
. По сути, мы хотим только «заполнить» последние установленные скобки, и это хорошо, потому что именно это делает приведенный выше код (как ни странно, похоже, что кто-то установил его именно так, как нам нужно … lol).
Это также должно удалить из массива все, что не соответствует этому шаблону. Например:
$arr = array(
'3 BUILTINUsers:(OI)(CI)(F)',
'BUILTINUsers:(OI)(CI)(R)',
'22 BUILTINUsers:(OI)(CI)(R,W)',
'foo' //--- foo will not appear in the results, because it does not end with (...)
);
Надеюсь, это поможет!
preg_filter() идентичен preg_replace() за исключением того, что он возвращает только (возможно, преобразованные) объекты, в которых было совпадение. Для получения подробной информации о том, как работает эта функция, ознакомьтесь с документацией preg_replace(). https://www.php.net/manual/en/function.preg-filter.php
* PS Я привел приведенный выше пример, поскольку он подчеркивает разницу между preg_replace()
и preg_filter()
(упомянутый выше). Вы могли бы сделать то же самое с помощью just preg_replace()
, если вы уверены, что в каждом элементе всегда будет совпадение.
Ответ №2:
Здесь вы можете перейти
$arr = array(
'3 BUILTINUsers:(OI)(CI)(F)',
'BUILTINUsers:(OI)(CI)(R)',
'22 BUILTINUsers:(OI)(CI)(R,W)'
);
$newArr = array();
foreach($arr as $k => $v){
$lastElement = array_filter(explode('(',explode(':',$v)[1]));
$newArr[] = '('.$lastElement[count($lastElement)];
}
print_r($newArr);
Результат :-
Array
(
[0] => (F)
[1] => (R)
[2] => (R,W)
)