При переборе массива в цикле результат применения функции к элементам массива не сохраняется

Доброй ночи.

Помогите, пожалуйста.

Никак не могу понять как правильно очищается массив с помощью htmlentities сущностей.

Пример кода:


$x = ['hello'=> '<script>', 
     'world'=>'<?php echo Hello?>'];


foreach ($x as $v) {

    $clean=htmlentities($v);

}

print_r($clean);


В данном случае в массиве 2 значения и они очищаются, но как только я добавляю 3-й ключ и 3-е значение, на выходе получается только последнее значение, 2 остальных пропадают.

Вот пример с 3-мя ключами, который выводит только последнее значение, а первые два - нет.

$x = ['hello'=> '<script>', 
      'world'=>'<?php echo Hello?>', 
      'ayco'=>'<style>'];

foreach ($x as $v) {

    $clean=htmlentities($v);

}

print_r($clean);

В чем была не права?


Ответы (1 шт):

Автор решения: Michael

Вы не изменяете исходный массив, а создаёте новую переменную, которая перезаписывается при каждой итерации foreach, а выводится один раз после всех итераций, то есть выводится последнее её значение.

Чтобы изменить исходный массив, нужно на него ссылаться при помощи «&» (Присваивание по ссылке):

$array = [
    'hello' => '<script>', 
    'world' => '<?php echo Hello?>', 
    'ayco' => '<style>'
];

foreach ($array as &$linked_value) {

    $linked_value = htmlentities($linked_value);

}

print_r($array);

Или использовать ключи:

$array = [
    'hello' => '<script>', 
    'world' => '<?php echo Hello?>', 
    'ayco' => '<style>'
];

foreach ($array as $key => $value) {

    $array[$key] = htmlentities($value);

}

print_r($array);

Если вы пытаетесь предотвратить инъекции, вам не поможет htmlentities — почитайте ответы на вопрос «Грамотная защита от SQL-Injection»

→ Ссылка