@sequelone

Как объединить 3 массива из файлов после цикла foreach?

Всем привет. Подскажите пожалуйста, каким образом можно объединить несколько массивов в один через функцию array_merge() после цикла foreach?

В переменной $config массив:

<?php

return [
    'genres' => [
        'langs' => ['ru', 'en', 'de'],
    ]
];


Записи в языковых файлах выглядят так:

6437ee8b80219385301702.png

Пишу такую функцию:

public function getFilesGenres() {
        $files = scandir(__DIR__.'/genres');
        $config = config('songscrud.genres.langs');

        $array = [];
        foreach($config as $lang) {
            foreach ($files as $file)
            {
                if(preg_match('/\.(php)/', $file))
                {
                    $path = __DIR__.'/genres/' . $file;
                    $ext = pathinfo($file, PATHINFO_FILENAME);

                    if ($lang === $ext) {
                        $array[$lang] = require($path);
                        $array = array_merge($array[$lang]);
                    }
                }
            }

        }

        return $array;
    }


Записываю каждый массив в массив с языком типа en, ru, de. В итоге выдаёт только массив из первого файла и ничего не объединяется. Пробовал записывать так:

$array1 = ['id' => 1, 'parent_id' => NULL, 'lft' => NULL, 'rgt' => NULL, 'depth' => 1, 'name_ru' => 'Народная музыка', 'slug_ru' => 'народная-музыка', 'translit_ru' => 'narodnaja-muzyka'];
        $array2 = ['id' => 1, 'parent_id' => NULL, 'lft' => NULL, 'rgt' => NULL, 'depth' => 1, 'name_de' => 'Ethnische Musik', 'slug_de' => 'ethnische-musik'];
        $array3 = ['id' => 1, 'parent_id' => NULL, 'lft' => NULL, 'rgt' => NULL, 'depth' => 1, 'name_en' => 'Ethnic music', 'slug_en' => 'ethnic-music'];

        return array_merge($array1, $array2, $array3);


6437f1bdeb6ba539838701.png

Такой код работает хорошо и объединяет всё в один массив. Как объединять массивы динамично через файлы с массивами используя цикл?
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) Вопрос изначально был хреново описан, слава яйцам ТС догадался что мы не знаем что хранится в его массивах и что надо получить в итоге... Первое правило решения задачи - хорошо описать исходные данные и требуемый результат.
2)
В переменной $config массив:
Массив состоит из 1 элемента, было бы странно ожидать что итераций foreach будет больше одной. Возможно имеет смысл проверять переменные чаще, если результат не соответствует ожиданиям, var_dump/dd($lang) внутри foreach был бы очень кстати...
3) У вас есть список языков, который соответствует названиям файлов, зачем дергать каждый раз весть список файлов, когда можно просто открыть файл __DIR__/$lang.php? Ну, разве что нужна проверка на file_exists()...
4) Вам дважды указали на ошибку с отсутствием второго аргумента в array_merge, которую вы проигнорировали...
Ответ написан
Комментировать
OrlovEvgenii
@OrlovEvgenii
golang developer / DevOps
public function getFilesGenres() {
    $files = scandir(__DIR__.'/genres');
    $config = config('songscrud.genres.langs');

    $resultArray = [];
    foreach($config as $lang) {
        foreach ($files as $file) {
            if(preg_match('/\.(php)/', $file)) {
                $path = __DIR__.'/genres/' . $file;
                $ext = pathinfo($file, PATHINFO_FILENAME);

                if ($lang === $ext) {
                    $array = require($path);
                    $resultArray = array_merge($resultArray, $array);
                }
            }
        }
    }

    return $resultArray;
}
Ответ написан
@iljaGolubev
Не совсем понятно что лежит в __DIR__/genres/ и что в итоге должно быть в $array. Но если догадаться...

Измените подход: заполняйте один массив цикл. Маска файлов в вашем коде фиксированная. так что как-то так:

public function getGenres() {
    $genres=[];
    foreach( config('songscrud.genres.langs') as $lang ){
        $filename = __DIR__ . '/genres/' . $lang . '.php' ;
        $genres[$lang] = require($filename);
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
03 мая 2024, в 14:52
100000 руб./за проект
03 мая 2024, в 14:40
1000 руб./за проект