#php #arrays #recursion #multidimensional-array
#php #массивы #рекурсия #многомерный массив
Вопрос:
У меня есть многомерный массив, содержащий некоторые текстовые строки, которые нуждаются в изменении. Моей первоначальной мыслью было повторить его рекурсивно и внести изменения, но я понял, что внутренний вызов функции должен нарушать ссылки, и я не вижу способа обойти это.
function mysqlifyArray($array)
{
global $connection;
foreach ($array as amp;$item)
{
if (is_string($item))
{
echo $item;
$item = mysqli_real_escape_string($connection, $item);
echo $item.'<br>';
}
elseif (is_array($item))
{
$item = mysqlifyArray($item);
}
}
unset($item);
return $array;
}
Комментарии:
1. почему рекурсивный, а не просто циклический по каждому измерению?
2. @AllanS. Хансен, потому что количество измерений может варьироваться
Ответ №1:
Установите ссылку в объявлении вашей функции
function mysqlifyArray(amp;$array)
{
// ....
}
Ответ №2:
В качестве альтернативы, вы могли бы использовать встроенный array_walk_recursive()
function mysqlify(amp;$value, $index) {
global $connection;
return $value = mysqli_real_escape_string($connection, $value);
}
function mysqlify_array(amp;$array) {
return array_walk_recursive($array, 'mysqlify');
}
Ответ №3:
Это может помочь вам:
function mysqlifyArray($array)
{
global $connection;
foreach ($array as $item)
{
if (is_string($item)) {
echo $item;
$item = mysqli_real_escape_string($connection, $item);
echo $item.'<br>';
} else if (is_array($item)) {
$item = mysqlifyArray($item);
}
unset($item);
}
return $array;
}
Примечание: я не уверен, почему вы использовали ссылку для переменной $item, вместо этого вы можете использовать ссылочную переменную в методе.
Комментарии:
1. Я думаю, что передача ссылок устарела в 5.3.0 и удалена из 5.4.0.
2. @copper.hat У вас есть какая-нибудь ссылка для поддержки этого?
3. @swordofpain: Посмотрите на первую заметку в php.net/manual/en/language.references.pass.php .
4. @copper.hat Это не одно и то же. В нем говорится, что вы получите сообщение об ошибке, если попытаетесь принудительно ввести ссылку во время вызова (т. Е. При вызове функции, например
$b = my_func(amp;$a)
). В нем также говорится, что достаточно объявить ссылку во время определения (т. Е. При объявлении функции, напримерfunction my_func(amp;$a) { ... }
). Я полагаю, что разработчики PHP немного очищают свою кодовую базу и удалили некоторые крайние случаи, когда для работы механизма требовались ссылки как на время определения, так и на время вызова.5. @swordofpain: OP отредактировал ответ, ранее там была строка вида «$item = mysqlifyArray (amp;$item);», на которую ссылался мой комментарий. Я должен был быть немного более четким в отношении того, что я имел в виду.