Задать вопрос
yaleksandr89
@yaleksandr89
PHP developer

Как правильно привести значения в массиве к типу int?

Добрый день!
В большей степени хотелось бы понять "как правильно", поэтому решил спросить совета.
Выполняю условие:
if (!empty($filter) && in_array($attributes_id, $filter)) {
    $checked = ' checked';
} else {
    $checked = null;
}

$attributes_id имеет тип (int), в массиве $filter у значений тип (string). Я взял за правило, где это возможно, выполнять проверку не только по значению, но и по типу, in_array() дает такую возможность, если указать третий параметр true.

Но если проверять in_array($attributes_id, $filter, true) проверка естественно не проходит. Скорректировал проверку до следующего вида:
in_array((string)$attributes_id, $filter, true)
Но как мне кажется, правильнее приводить id к целочисленному значению. Ввиду этого несколько вопросов:
  • Насколько корректно проверка in_array((string)$attributes_id, $filter, true), имею ввиду что attributes_id приведен к строке
  • Если приводить значения массива к целочисленным, как правильнее всего это сделать? У одно предположение, перебрать его как-то так:

if ($filter){
    $data = [];
    foreach ($filter as $key => $value){
        $data[$key] = (int)$value;
    }
}

if (!empty($filter) && in_array($attributes_id, $data, true)) {
    $checked = ' checked';
} else {
    $checked = null;
}
  • Вопрос задан
  • 263 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 4
@DanKud
На счет правильности или неправильности тут вопрос мне кажется ставить не совсем корректно. Как вам удобнее, так и делайте. Тут больше вопрос в том - какой вообще по сути смысл приводить значение к (string) в вашем первом примере? При нестрогом сравнение (то есть без третьего параметра true) это по сути будет сделано автоматически. Я лично в такой ситуации вообще не вижу смысла от строго сравнения типов. Просто то преобразование типов, которое вы хотите делать, будет сделано автоматически при нестрогом сравнение самим интерпретатором.

Перебор массива можно также сделать с помощью array_map:

$arr = array_map(function($n) {
    return (int)$n;
}, $arr);
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
а почему не

$checked = null;
if (!empty($filter) {
    foreach ($filter as $value) {
        if ((int)$value === $attributes_id) {
            $checked = ' checked';
            break;
        }
    }
}
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
В общем, если нужно отсеять нулевые значения, то
$filter = array_filter($filter, 'intval');
если оставить, то
$filter = array_map('intval', $filter);

Но я смотрю тут уже столько умных рассуждений и заумных вариантов решения. Куда уж мне-то со своими огрызками.
Ответ написан
@muhasa
Ваш вариант вполне неплохой, разве что теперь отпадает вообще надобность проверять типизацию в in_array, Вы же сами весь массив привели к int :)

А вообще, какой смысл здесь в проверке со строгой типизацией?.. Конкретно в данном случае, какая разница между 1 и "1"? Я предполагаю, что тут это излишне.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы