Почему count в данном случае бессилен?
$arrNotSorted = explode(' ', $strNotChanges);
$arrNotSorted = array_filter($arrNotSorted, 'strlen');
foreach ($arrNotSorted as $value) {
    if (is_numeric($value)) {
        return 'вырезанное число:' . $value;
    }

    if (strlen($value) === 1) {
        return 'вырезанный символ:' . $value;
    }

    if (preg_match('/^\d[^\d]+$/iu', $value)) {
        return 'смежное значение:' . $value;
    }

    return 'строка: ' . $value;
}
1. Учитесь писать человеко-понятный код. Часто наблюдаю картину, когда используется switch там, гед он не особо то нужен (я не спорю, иногда его необходимо использовать).
2. Функция split - устарела, вместо нее есть explode.
3. Судя по названию метода: valid, это как-то связано с валидацией. Не стоит использовать в нем echo и другие конструкции, не связанные с валидацией.
4. Соблюдайте тип проверяемых значений! В switch вообще удивительно, что у вас хоть что-то работает.
Например $value у вас '4abc', в во втором case вы делаете примерно следующее:
'4abc' == (count('4abc') == 1 and is_numeric('4abc') == false)
Это хрень постная в общем. Для строк не используйте count, есть strlen.
5. Сделайте что-то с форматированием, есть PSR2 например.
6. Да, чуть не забыл)) что на счет символов: \b, \r, \t, \n ?
count(str_split($value)) ==1
а для того чтобы работала русская кодировка
count(preg_split('//u',$value,-1,PREG_SPLIT_NO_EMPTY)) =1
Вот такое решение если кому то надо сделать проверку на is_char