PHP: Detected an illegal character in input string

При преобразовании строки в требуемую кодировку к кодировке, требуемой на выходе можно добавить параметр TRANSLIT или IGNORE. Первый включает режим транслитерации и заменяет проблемный символ на один или несколько наиболее близких по внешнему виду. Ключевое слово — заменяет. Возможно, наиболее близким символом будет знак вопроса, но тем не менее. Второй параметр удаляет те символы, которые не могут быть представлены в требуемой кодировке.

В комментариях к документации один из пользователей упомянул про символ, который не получается проигнорировать — на нём даже с параметром IGNORE iconv падает с ошибкой «Detected an illegal character in input string». И поэтому появилась рекомендация использовать одновременно два параметра: //TRANSLIT//IGNORE — типа, игнорировать всё, что не удалось транслитерировать. Однако, повторюсь, параметр TRANSLIT заменяет все проблемные символы, после него уже нечего игнорировать. В итоге получаем такую картину:

// работает
iconv('utf-8', 'windows-1251//TRANSLIT', '∙'); 
iconv('utf-8', 'windows-1251//TRANSLIT//IGNORE', '∙');

// падает с ошибкой Detected an illegal character in input string
iconv('utf-8', 'windows-1251//IGNORE', '∙'); 
iconv('utf-8', 'windows-1251//IGNORE//TRANSLIT', '∙');

В итоге имеем бессмысленные комбинации //TRANSLIT//IGNORE и //IGNORE//TRANSLIT, которые встречаются в ответах на SO.

Python: проверка на прерывание цикла

В Python у циклов while и for есть опциональный блок else, который проверяет, выполнился ли цикл полностью. Если ключевое слово break не было вызвано, будет выполнен блок else.

while… else:

numbers = [1, 3, 5]

position = 0

while position < len(numbers):
    number = numbers[position]
    if number % 2 == 0:
        print('Найдено четное число', number)
        break
    position += 1
else:
    print('Четное число не найдено')

for… else:

numbers = [1, 3, 5]

for number in numbers:
    if number % 2 == 0:
        print('Найдено четное число', number)
        break
else:
    print('Четное число не найдено')

Подобная конструкция позволяет выполнить некоторое действие при полном завершении работы с циклом (вывод сообщения здесь — явный флаг штатного завершения обхода цикла):

for name in ['Алиса', 'Боб']:
    print(name)
else:
    print('Обход цикла завершен')

Предел прочности

Прекрасное о Дамбе Баньцяо в Википедии:

Дамба была сконструирована таким образом, чтобы пережить крупнейшие наводнения, которые случаются раз в тысячу лет (306 мм осадков за день). Однако в августе 1975 года произошло крупнейшее за 2000 лет наводнение…

PHP: Проверка строк, содержащих числа

Если на входе есть строка, которая может содержать целое число или число с плавающей точкой и нужно эту строку привести к нужному состоянию, то можно сделать так:

if (is_numeric($string)) {
    if ((int)$string == $string) {
        $string = (int)$string;
    } else {
        $string = (float)$string;
    }
}

Функция is_numeric проверяет, является ли переменная числом или строкой, содержащей число (ни is_int, ни is_float не делают вторую часть проверки и при получении строки на входе возвращают false). Далее приводим строку к целому числу и делаем нестрогое сравнение, чтобы убедиться, что перед нами действительно целое число.

Яндекс

Яндекс — это совокупность разных сервисов, развивающихся независимо. В разных местах можно встретить подсказки, которые генерируются автоматически. Алгоритмы разные, поэтому на странице исполнителя Serenity появляется подсказка «Бывшая американская порноактриса«:

Serenity (porn star)

Хотя куда логичнее было бы увидеть там описание музыкального коллектива (хотя это и другой исполнитель, но всё равно ближе, чем порноактриса):

Serenity (music band)

Йода в программировании

В программировании на языках с Си-синтаксисом сравнение можно оформить двумя способами ($x === 0) или (0 === $x). Первый способ — классический (или регулярный), а второй назван в честь персонажа «Звёздных войн» нотацией Йоды (условия Йоды, Yoda conditions).

PhpStorm не видит переменные переменных

PhpStorm не видит динамическое определение переменных. Вот код, в котором IDE видит ошибки там, где их нет:

foreach (array('foo', 'bar', 'baz') as $postfix) {
    $postfixedVariableName = sprintf('variable_%s', $postfix);
    $$postfixedVariableName = $postfix;
}
echo $variable_foo, PHP_EOL; // PhpStorm: Undefined variable 'variable_foo'
echo $variable_bar, PHP_EOL; // PhpStorm: Undefined variable 'variable_bar'
echo $variable_baz, PHP_EOL; // PhpStorm: Undefined variable 'variable_baz'

Чтобы PhpStorm увидел подобные переменные, необходимо добавить декларацию переменных в текущей области видимости:

/** @var $variable_foo */
/** @var $variable_bar */
/** @var $variable_baz */
foreach (array('foo', 'bar', 'baz') as $postfix) {
    $postfixedVariableName = sprintf('variable_%s', $postfix);
    $$postfixedVariableName = $postfix;
}
// ...