Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для kib0rg
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 49

Замена цикла foreach на array_map

26.01.2021, 22:43. Показов 1260. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Есть такой вот код:
PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
 
namespace Differ\Formatters\Stylish;
 
use function Funct\Collection\flatten;
 
function render($data)
{
    $depth = 1;
    $stringedTree = stylish($data, $depth);
    $finalResult = '{' . "\n" . implode("\n", flatten($stringedTree))  . "\n" . '}';
    $finalResult = str_replace("'", '', $finalResult);
    print_r($finalResult);
    return $finalResult;
}
 
function stylish($data, $depth)
{
    if (array_key_exists('key', $data[0])) {
        array_multisort(
            array_column($data, 'key'),
            SORT_ASC,
            SORT_NATURAL + SORT_FLAG_CASE,
            $data
        );
    }
 
    $result = array_map(function ($item) use ($depth) {
        $plus = "  + ";
        $minus = "  - ";
        $space = "    ";
        $doublePoint = ": ";
        $tabulation = str_repeat('    ', $depth - 1);
 
        switch ($item['type']) {
            case 'added':
                $stringedData = convertToString($item['value'], $depth);
                return $tabulation . $plus . $item['key'] . $doublePoint . $stringedData;
            case 'removed':
                $stringedData = convertToString($item['value'], $depth);
                return $tabulation . $minus . $item['key'] . $doublePoint . $stringedData;
            case 'changed':
                //конвертим старое значение
                $oldValue = convertToString($item['oldValue'], $depth);
                //конвертим новоe значние
                $newValue = convertToString($item['newValue'], $depth);
                // записываем в переменне с форматирование
                $stringedNewValue = $tabulation . $plus . $item['key'] . $doublePoint . $newValue;
                $stringedOldValue = $tabulation . $minus . $item['key'] . $doublePoint . $oldValue;
                // возвращаем две новые строки
                return $stringedOldValue . "\n" . $stringedNewValue;
            case 'unchanged':
                $stringedData = convertToString($item['value'], $depth);
                return $tabulation . $space . $item['key'] . $doublePoint . $stringedData;
            case 'nested':
                // получаем то что вложено
                $children = $item['children'];
                // делаем первую строку с ключом и отступом
                $stringedHeader = $tabulation . $space . $item['key'] . $doublePoint .  '{';
                // тело данных, вызываем функцию рекурсивно с вложенными данными
                $body = stylish($children, $depth + 1);
                // пересобираем тело с новой строки
                $stringedBody = implode("\n", $body);
                return $stringedHeader . "\n" . $stringedBody . "\n" . $tabulation . $space . '}';
        }
    }, $data);
 
    return $result;
}
 
function convertToString($data, $depth)
{
    if ($data === null || is_bool($data)) {
        return strtolower(var_export($data, true));
    } elseif (is_string($data) || is_double($data) || is_int($data)) {
        return var_export($data, true);
    } elseif (!is_array($data)) {
        return $data;
    }
    $space = '    ';
    $tabulation = str_repeat($space, $depth);
    $string = '';
 
    // исключили одиночыне случаи
    foreach ($data as $key => $value) {
        //print_r($data);
 
        if (!is_array($value)) {
            $string = $tabulation . $space . $key . ': ' . $value;
        }
        // тут проверяем на вложенность, если массив в массиве
        if (is_array($value) && is_array($value[key($value)])) {
            $converted2 = convertToString($value, $depth + 1);
            $string = $string . "\n" . $tabulation . $space . $key . ': ' . $converted2;
        }
 
        if (is_array($value) && !is_array($value[key($value)])) {
            $converted = convertToString($value, $depth + 1);
            $string = $string . "\n" . $tabulation . $space . $key . ': ' . $converted;
            $string = preg_replace('/^\h*\v+/m', '', $string); // удаляем пустые строки
        }
    }
 
    return "{" . "\n" . $string . "\n" . $tabulation . "}";
}
Нужно заменить foreach цикл на array_map. Array_map должен отдавать всё тоже самое, что и сейчас делает foreach

Суть функции вкратце. Есть массив массивов, в которых в свою очередь ассоциативные массивы.
Далее эти массивы надо отконвертировать в один большой string с определенным форматированием.

Для этого вызывается функция render. Она в свою очередь вызывает функцию stylish которая как раз конвертирует массивы в стринги с отступами, кавычками где надо и так далее. Вложенность массивов я проверял циклом foreach , и вот как раз его надо поменять на array_map, но уже несколько часов не могу получать аналогичный результат.

что бы array_map у себя в теле перебирал входящие массивы, и при этом разделял ключи=>значения, я сделал так
PHP Скопировано
1
2
3
4
5
$stringedData = array_map(function($key, $value) use ($tabulation, $space, $depth) {
      if (!is_array($value)) {
             $stringedData = $tabulation . $space . $key . ': ' . $value;
      }
}, array_keys($data), $data);
но не могу рекурсивно углубиться =(

Может кто подсказать как быть?

Добавлено через 50 минут
Решено!

PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$stringedData = array_map(function ($key, $value) use ($depth, $tabulation, $space, $string){
        if (!is_array($value)) {
            return $tabulation . $space . $key . ': ' . $value;
        }
        if (is_array($value) && is_array($value[key($value)])) {
            $stringed = convertToString($value, $depth + 1);
            return $tabulation . $space . $key . ': ' . $stringed;
        }
        if (is_array($value) && !is_array($value[key($value)])) {
            $stringed2 = convertToString($value, $depth + 1);
            $string = $string . "\n" . $tabulation . $space . $key . ': ' . $stringed2;
            return preg_replace('/^\h*\v+/m', '', $string); // удаляем пустые строки
        }
    }, array_keys($data), $data);
    $stringedData = implode("\n", $stringedData);
    return "{" . "\n" . $stringedData . "\n" . $tabulation . "}";
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2021, 22:43
Ответы с готовыми решениями:

Избавиться от цикла foreach
Получаю серийный номер флешки: ManagementObjectSearcher theSearcher = new ManagementObjectSearcher(&quot;SELECT * FROM Win32_DiskDrive WHERE...

Рекурсия цикла foreach
Добрый день, решил обратиться к вам с вопросом по учебе У меня есть одномерный массив mas размерности n К примеру n=2 И цикл...

Выйти из цикла forEach
function sumOfSquaresForTwo(...args) { let N = args; args.splice(args.length-1); let result = 0; ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.01.2021, 22:43
Помогаю со студенческими работами здесь

Заменить 3 цикла foreach на 1
Добрый день! Подскажите, как заменить 3 цикла foreach на 1 private Boolean FillListBox(string aPath) { ...

Работа цикла foreach
1. Перед перебором элементов цикл считает их количество и перебирает или перебирает пока не наткнётся на null? 2. Он может перебрать...

использование цикла Foreach
Добрый день дорогие форумчане, у меня такой вопрос, я хочу использовать цикл Foreach в свои разработках, так как привык к Foreach при...

Вложенность цикла foreach
Ребят привет) Нуждаюсь в вашей помощи) Ситуация такая: Когда цикл получает значение char_title(заголовок), итерация начинается заново. И...

По поводу цикла foreach
Добрый день! Мой вопрос только ради интереса, я не знаю так сказать как называется буква &quot;k&quot; в данном коде. Дословно: Для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
Реляционная модель и правила Кодда: фундамент современных баз данных
Codd 05.04.2025
Конец 1960-х — начало 1970-х годов был периодом глубоких трансформаций в области хранения и обработки данных. На фоне растущих потребностей бизнеса и правительственных структур существовавшие на тот. . .
Асинхронные операции в Django с Celery
py-thonny 05.04.2025
Разработчики Django часто сталкиваются с проблемой, когда пользователь нажимает кнопку отправки формы и. . . ждёт. Секунды растягиваются в минуты, терпение иссякает, а интерфейс приложения замирает. . . .
Использование кэшей CPU: Максимальная производительность в Go
golander 05.04.2025
Разработчикам хорошо известно, что эффективность кода зависит не только от алгоритмов и структур данных, но и от того, насколько удачно программа взаимодействует с железом. Среди множества факторов,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер