Почему не работает логическое "или" и in_array
помогите верстальщику, для себя решил поучить php, но что-то пошло не так вообщем задача то простая нужно посчитать какой элемент в массиве arr = [1,2,2,3,3,3,4,3,4,2,4,5,5,6,6,5,5,6,7,7,5,7,7,8,8,9,9] встречается чаще всего на моем любом js я бы сделал что-то типа такого
function myFunc(arr){
const objRepeatedChars = arr.reduce((acc, curr) => {
acc[curr] = (acc[curr] || 0) + 1;
return acc;
}, {})
return objRepeatedChars
}
пытаюсь сделать на php
<?php
$arr = [1,2,2,3,3,3,4,3,4,2,4,5,5,6,6,5,5,6,7,7,5,7,7,8,8,9,9];
$newArr = [];
foreach($arr as $value) {
$newArr[$value] = ($newArr[$value] || 0) + 1;
}
print_r($newArr)
?>
ОШИБКА!!! Undefined array key ну ок подумал я undefinded - это же false почему не сработало логическое или
ладно поискав нашел такую замечательную ф-ию как in_array — Проверяет, присутствует ли в массиве значение вот оно подумал я. На каждой итерации цикла буду проверять присутствует ли в массиве значение и если присутствует увеличивать
<?php
foreach($arr as $value) {
if(in_array($newArr[$value], $arr)) $newArr[$value]++;
else $newArr[$value] = 1;
}
?>
ОШИБКА!!! Undefined array key вот это мне вообще не понравилось ну что не так то!
поискав ещё чуть обнаружил ещё замечательную ф-ию isset ну думаю если и она не сработает на этом моё php заканчивается и вуаля!!!
<?php
foreach ($arr as $value) {
if(isset($newArr[$value])){
$newArr[$value]++;
} else {
$newArr[$value] = 1;
}
}
?>
Ура!! а вот так работает
Собственно вопрос какого... почему первые 2 варианта не сработали?
Ответы (1 шт):
В первом варианте вместо
$newArr[$value] = ($newArr[$value] || 0) + 1;
напишите
$newArr[$value] = ($newArr[$value] ?? 0) + 1;
и всё.
ну или вам привычным способом:
$arr = [1,2,2,3,3,3,4,3,4,2,4,5,5,6,6,5,5,6,7,7,5,7,7,8,8,9,9];
$newArr = array_reduce($arr, function($acc, $value) {
$acc[$value] = ($acc[$value] ?? 0) + 1;
return $acc;
}, []);
print_r($newArr);
Не сработал потому, что он говорит Undefined offset: -5 а не Undefined array key. Это разные вещи. То есть в PHP если нет ключа он генерирует предупреждение, а не возвращает undefined. И проверить на существование можно через isset, который определяет, была ли установлена переменная значением, отличным от null. isset вернёт false при проверке переменной которая была установлена значением null. Также учтите, что NULL-символ ("\0") не равен константе null
in_array не сработал потому, что до него дело и не дошло вовсе. Потому что ошибка появилась раньше, как в описании выше