Пройти через многомерный массив в php и выполнить вставку mysql (данные о запасах)

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

Значения массива, которые мне нужно вставить в запрос sql, следующие:

candles[0][complete], candles[0][volume], candles[0][mid][h], candles[0][mid][l], candles[0][mid][c]  
candles[1][complete], candles[1][volume], candles[1][mid][h], candles[1][mid][l], candles[1][mid][c] 
candles[2][complete], candles[2][volume], candles[2][mid][h], candles[2][mid][l], candles[2][mid][c] 

Массив:

$get_instruments_candles = Array
(
    [instrument] => EUR_USD
    [granularity] => H4
    [candles] => Array
        (
            [0] => Array
                (
                    [complete] => 1
                    [volume] => 4491
                    [time] => 2009-01-01T22:00:00.000000000Z
                    [bid] => Array
                        (
                            [o] => 1.40390
                            [h] => 1.40515
                            [l] => 1.39445
                            [c] => 1.39540  
                        )

                    [mid] => Array
                        (
                            [o] => 1.40440
                            [h] => 1.40565
                            [l] => 1.39470
                            [c] => 1.39565
                        )

                    [ask] => Array
                        (
                            [o] => 1.40490
                            [h] => 1.40615
                            [l] => 1.39495
                            [c] => 1.39590
                        )

                )

            [1] => Array
                (
                    [complete] => 1
                    [volume] => 6866
                    [time] => 2009-01-02T02:00:00.000000000Z
                    [bid] => Array
                        (
                            [o] => 1.39545
                            [h] => 1.39690
                            [l] => 1.38447
                            [c] => 1.38641
                        )

                    [mid] => Array
                        (
                            [o] => 1.39570
                            [h] => 1.39715
                            [l] => 1.38472
                            [c] => 1.38666
                        )

                    [ask] => Array
                        (
                            [o] => 1.39595
                            [h] => 1.39740
                            [l] => 1.38497
                            [c] => 1.38691
                        )

                )

            [2] => Array
                (
                    [complete] => 1
                    [volume] => 12529
                    [time] => 2009-01-02T06:00:00.000000000Z
                    [bid] => Array
                        (
                            [o] => 1.38635
                            [h] => 1.39679
                            [l] => 1.38391
                            [c] => 1.39471
                        )

                    [mid] => Array
                        (
                            [o] => 1.38660
                            [h] => 1.39688
                            [l] => 1.38400
                            [c] => 1.39480
                        )

                    [ask] => Array
                        (
                            [o] => 1.38685
                            [h] => 1.39697
                            [l] => 1.38409
                            [c] => 1.39489
                        )

                )

        )

 )

Этот массив может состоять из до 5000 значений Candle [], поэтому мне нужно найти лучший способ выполнить цикл foreach или while в php для запуска, выбрасывает значения массива и выполняет вставку MySQL

// connect to mysql database

// Do a loop to create and insert the values into database    

// Create sql Query to insert. [0] would be changed to arrays value 0,1,2,3,etc

$sql = "INSERT INTO table (complete, volume, high, low, close) 
VALUES ('{candles[0][complete]}','{candles[0][volume]}','{candles[0][mid][h]}','{candles[0][mid][l]}','{candles[0][mid][c]}')";

Решил ли один из этих ответов вашу проблему? Если да, отметьте ответ как принятый (зеленая стрелка под стрелками голосов «за» / «против»). В противном случае вы можете предоставить дополнительную информацию, которая поможет решить проблему. См. stackoverflow.com/help/someone-answers

Nick 01.09.2018 03:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
1
433
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете использовать цикл foreach, а затем обратиться к текущему элементу цикла. Лучше всего использовать подготовленное заявление. Вот версия PDO:

$stmt = $link->prepare("INSERT INTO table (complete, volume, high, low, close) 
                        VALUES (:complete, :volume, :high, :low, :close)";
$stmt->bindParam(':complete', $complete);
$stmt->bindParam(':volumn', $volume);
$stmt->bindParam(':high', $high);
$stmt->bindParam(':low', $low);
$stmt->bindParam(':close', $close);

foreach ($get_instrument_candles['candles'] as $candle) {
    $complete = $candle['complete'];
    $volume = $candle['volume'];
    $high = $candle['mid']['h'];
    $low = $candle['mid']['l'];
    $close = $candle['mid']['c'];
    $stmt->execute();
}

Версия mysqli будет выглядеть так:

$complete = $volume = $high = $low = $close = null;
$stmt = $link->prepare("INSERT INTO table (complete, volume, high, low, close) 
                        VALUES (?, ?, ?, ?, ?)";
$stmt->bind_param("iiiii", $complete, $volume, $high, $low, $close);

Цикл foreach такой же, как и для PDO.

Возможно, если вы выровняете имена заполнителей со структурой ассоциативного массива, вы можете просто execute() напрямую противостоять этому.

tadman 31.08.2018 02:12

@tadman Похоже на ответ публичного API, поэтому он, вероятно, не имеет большого контроля над структурой.

Barmar 31.08.2018 02:16

Это правда, хотя было бы неплохо, если бы на это можно было положиться.

tadman 31.08.2018 02:17

спасибо за быстрый ответ, это решает проблему доступа к массиву

xop32 01.09.2018 17:52

Другой подход (при условии, что вы доверяете входным данным) - это создание одного большого запроса INSERT. Максимальный размер запроса (установленный max_allowed_packet, по умолчанию 4 МБ для MySQL <8.0.2) должен быть более чем достаточным для вставки данных для 5000 свечей. Итак, код будет выглядеть так:

$sql = "INSERT INTO table (complete, volume, high, low, close) VALUES ";
foreach ($get_instrument_candles['candles'] as $candle) {
   $sql .= "({$candle['complete']}, {$candle['volume']}, {$candle['mid']['h']}, {$candle['mid']['l']}, {$candle['mid']['c']}),";
}
// strip the trailing comma
$sql = substr($sql, 0, -1);

Если вы не можете быть уверены, что входные данные безопасны, лучше всего использовать подготовленный оператор @Barmar.

массив api безопасен, поэтому вставка, о которой вы упомянули, является хорошим вариантом, мне нужно сделать несколько проверок, если данные уже сохранены, а затем просто добавить, как вы упомянули

xop32 01.09.2018 17:54

Если у вас есть уникальный ключ для данных, вы можете просто использовать INSERT IGNORE и не беспокоиться о том, чтобы проверить, сохранен ли он уже.

Nick 01.09.2018 21:53

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