Array_filter() возвращает весь массив, а не только значение ключа

Я работаю с функцией 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

Несмотря на то, что я пытаюсь вернуть только значение ключа имени, я получаю весь объект массива. Почему?

Вы неправильно поняли, как работает фильтр массива. Вы должны вернуть false или true. Если вы укажете строку, это приведет к true, что вернет текущее значение обратно в массив.

Wimanicesir 11.07.2024 10:45

@deceze хочет, чтобы вы прочитали это очень важное сообщение: Зачем проверять isset() и !empty()

mickmackusa 11.07.2024 14:04

@mickmackusa deceze пошел бы еще дальше и задался бы вопросом, почему здесь вообще необходимы isset или empty. Разве переменная не гарантированно существует и содержит массив?

deceze 11.07.2024 14:12

Понимание того, что обратный вызов array_filter() ожидает логическое значение и что array_filter() возвращает отфильтрованную копию входного массива, уже неоднократно объяснялось в разделе Stack Overflow. Эту страницу не нужно открывать повторно. Список дублей также содержит информацию о том, как фильтровать и изменять входной массив.

mickmackusa 12.07.2024 08:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно поняли, как работает фильтр массива.

Взято из документации PHP:

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

Перебирает каждое значение в массиве, передавая его функции обратного вызова. Если функция обратного вызова возвращает true, текущее значение из массива возвращается в массив результатов.

array_filter

Таким образом, вы можете возвращать только true или false. Когда это правда, он добавляет текущее значение в массив. Если вы хотите изменить возвращаемый массив, примените array_map после фильтра.

Другие вопросы по теме