Как убрать из массива все значения за исключением заданных? (Для PHP-программистов)

Перевожу строку в массив (строка состоит из букв, цифр и скобок - скобки разных видов: ()[]{}), далее из него следует удалить все буквы и цифры, оставить только скобки. Каким образом это можно сделать?

P.S. Вообще это подзадача к задаче на определение правильной скобочной последовательности.
  • Вопрос задан
  • 6710 просмотров
Решения вопроса 1
Ох уж эта "скобочная последовательность"))))

// исходный массив
$letters = array();

// массив символов, которые необходимо удалить
$no_delete = array('(', ')', '[', ']', '{', '}');

// пройдемся по всем символам
foreach($letters as $key => $char){

  // если символ не в "запретном списке" - удалить его из массива
  if(!in_array($char, $no_delete)) unset($letters[$key]);

}


А ещё можно пройтись регулярным выражением (preg_replace) и оставить только нужное, а дальше обрабатывать...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
shaks
@shaks
Сначала правда надо обратно собрать строку из массива )

<?php
$string = 'Param pam pam DS{FP}$%@@#[]]][[]#$';

echo preg_replace('/[^\(\)\[\]\{\}]/', '', $string); # => {}[]]][[]
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Решение самой задачи:
function checkBrackets($sData) {
        $sRegexp = '#^((?:\((?1)\)|\[(?1)\]|\{(?1)\}|[^()\[\]\{\}]++)*+)$#';
        return preg_match($sRegexp, $sData);
        }
assert('checkBrackets("(()()([][])[])")==true');
assert('checkBrackets("abc([dy]*[dx]Fz)")==true');
assert('checkBrackets("")==true');
assert('checkBrackets("()[]")==true');
assert('checkBrackets("foo()")==true');
assert('checkBrackets("foo(")==false');
assert('checkBrackets("pqr[Gdz)/(Hdx]")==false');
//test pass

Не пробуйте такой ответ давать на собеседовании, если не сможете повторить.
На самом деле регулярка страшно выглядит только из-за отсутствия форматирования (специально не форматировал для особого впечатления).
Если интересны регулярки - весьма рекомендую книжку: www.ozon.ru/context/detail/id/4066500

Убрать всё, кроме - preg_replace('~[^\[\]\(\)\{\}]~', '', $sInput)
Но в классическом решении через стек и это не нужно - в стек заносите только скобки, остальные символы игнорируете.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что-то почитал... если у вас задача по проверке правильной скобочной последовательности, то можно сделать так:

$str = '(a[b]3)[c';
$str = preg_replace('/[^\(\)\[\]\{\}]/', '', $str); //убираем все НЕ скобки
$brackets = explode('', $str);


ну а дальше раскладываем в стэк (читать про обратную польскую запись), и если он внезапно к концу строки будет не пустым - у нас что-то не так со скобками.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы