Как получить только последнюю скобку из нескольких массивов? PHP

#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)
)