Я работаю с функцией PHP array_filter(). Я замечаю странность. Позволь мне объяснить.
Это массив $languageDataArray
:-
$languageDataArray = array(
array(
'id' => 1,
'language' => 'en',
'name' => 'little'
),
array(
'id' => 2,
'language' => 'fr',
'name' => 'petre'
)
);
А это мой массив итераций языка $languageFolders
:-
$languageFolders = array('en', 'fr');
Теперь я выполняю цикл по каждому языковому элементу массива $languageFolders
, и когда значение узла/ключа 'language'
каждого элемента $languageDataArray
не равно 'en'
, я печатаю значение узла/ключа 'name'
каждого элемента $languageDataArray
if (isset($languageFolders) && !empty($languageFolders)) {
foreach($languageFolders as $keyLanguage => $rowLanguage) {
if ($rowLanguage !== 'en') {
$translatedName = NULL;
if (isset($languageDataArray) && !empty($languageDataArray)) {
$translatedNameData = array_filter($languageDataArray, function($languageObject) use($rowLanguage) {
if ($languageObject['language'] === $rowLanguage) {
echo $languageObject['name'] . "\n";
return $languageObject['name'];
}
});
$translatedName = array_shift($translatedNameData)['name'];
}
echo $translatedName;
}
}
}
В коде обратите внимание на две строки:
echo $languageObject['name'] . "\n";
return $languageObject['name'];
Внутри функции array_filter(), когда я выполняю echo $languageObject['name'];
, отображается только имя, но когда я пытаюсь return $languageObject['name'];
вместо только значения имени, возвращается весь элемент массива;
if (isset($languageFolders) && !empty($languageFolders)) {
foreach($languageFolders as $keyLanguage => $rowLanguage) {
if ($rowLanguage !== 'en') {
$translatedName = NULL;
if (isset($languageDataArray) && !empty($languageDataArray)) {
$translatedNameData = array_filter($languageDataArray, function($languageObject) use($rowLanguage) {
if ($languageObject['language'] === $rowLanguage) {
echo $languageObject['name'] . "\n";
return $languageObject['name'];
}
});
$translatedName = array_shift($translatedNameData)['name'];
}
echo $translatedNameData;
echo $translatedName;
}
}
}
Лок echo $translatedNameData;
выдает ошибку Warning: Array to string conversion in /tmp/t3ncOEgiEd.php on line 30
Несмотря на то, что я пытаюсь вернуть только значение ключа имени, я получаю весь объект массива. Почему?
@deceze хочет, чтобы вы прочитали это очень важное сообщение: Зачем проверять isset() и !empty()
@mickmackusa deceze пошел бы еще дальше и задался бы вопросом, почему здесь вообще необходимы isset
или empty
. Разве переменная не гарантированно существует и содержит массив?
Понимание того, что обратный вызов array_filter()
ожидает логическое значение и что array_filter()
возвращает отфильтрованную копию входного массива, уже неоднократно объяснялось в разделе Stack Overflow. Эту страницу не нужно открывать повторно. Список дублей также содержит информацию о том, как фильтровать и изменять входной массив.
Вы неправильно поняли, как работает фильтр массива.
Взято из документации PHP:
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
Перебирает каждое значение в массиве, передавая его функции обратного вызова. Если функция обратного вызова возвращает true, текущее значение из массива возвращается в массив результатов.
Таким образом, вы можете возвращать только true или false. Когда это правда, он добавляет текущее значение в массив. Если вы хотите изменить возвращаемый массив, примените array_map после фильтра.
Вы неправильно поняли, как работает фильтр массива. Вы должны вернуть false или true. Если вы укажете строку, это приведет к true, что вернет текущее значение обратно в массив.