От NULL до 0 - массив PHP

У меня есть массив, содержащий несколько записей. Некоторые из них строковые, другие - int. и они определены в MySQL с типом (int, varchar). Создаваемый мной массив выглядит так: (уменьшил массив, потому что он слишком длинный)

[3] => Array
    (
        [account_id] => *******
        [month_id] => 201903
        [month_comment] => 4,5% spend flat
        [month_spend] => 23000
        [month_budget] => 0
        [month_adops] => 1035
        [month_adops_forecast] => 1035
    )

[4] => Array
    (
        [account_id] => ******
        [month_id] => 201905
        [month_comment] => 
        [month_spend] => 
        [month_budget] => 0
        [month_adops] => 
        [month_adops_forecast] => 45
    )

[5] => Array
    (
        [account_id] => *******
        [month_id] => 201906
        [month_comment] => 
        [month_spend] => 
        [month_budget] => 0
        [month_adops] => 
        [month_adops_forecast] => 92
    )

Как вы можете видеть, некоторые из "month_spend" и / или "month_adops" пусты, проблема в том, что в PHP значение преобразуется в "NULL", когда поле в базе данных является целым числом, поэтому результат дает мне:

Incorrect integer value: '' for column 'month_spend' at row 2"

Итак, я попытался изменить это внутри цикла foreach следующим образом:

$result_replace = array();
foreach ($data_replace as $key => $result) {
    $result['month_id'] = substr_replace($result['month_id'], '2019', 0, 4);
    if (empty($result['month_budget'])) {
        $result['month_budget'] = 0;
        $result_replace[] = $result;
    }
    else if (empty($result['month_spend'])) {
        $result['month_spend'] = 0;
        $result_replace[] = $result;
    }
}

но похоже, что цикл foreach не редактирует данные?

Таким образом, в массиве из нескольких элементов может быть пустой «month_budget» или «month_spend» или «month_adops_forecast» и «month_adops», но я не могу использовать ИЛИ, потому что какой-то объект имеет значение в двух переменных и других 3 переменных. как лучше всего вставить 0, если в эти поля пусто. Маби, я должен переписать свой вопрос

Asim 23.08.2018 13:28

Не уверен, что это поможет, но вы можете обновить данные на месте, добавив & в $key => &$result. Это изменит исходный массив, а не создаст заменяющий массив.

Nigel Ren 23.08.2018 13:29

Покажите, пожалуйста, запрос SQL

AymDev 23.08.2018 13:34

Почему PHP должен преобразовывать 0 из базы данных в NULL? Никогда раньше такого не видел. Кроме того, отредактируйте свой вопрос, чтобы добавить больше деталей, не используйте для этого раздел комментариев.

Nico Haase 23.08.2018 13:39

В вашем SQL вы можете использовать IFNULL(month_budget, 0)

Nigel Ren 23.08.2018 13:43
Стоит ли изучать 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 и хотите разрабатывать...
1
5
84
5

Ответы 5

Используйте следующее, чтобы проверить оба, а не иначе, если

$result_replace = array();
foreach ($data_replace as $key => &$result) {
    $result['month_id'] = substr_replace($result['month_id'], '2019', 0, 4);
    if (empty($result['month_budget'])) {
        $result['month_budget'] = 0;
    }
    if (empty($result['month_spend'])) {
        $result['month_spend'] = 0;
    }
    $result_replace[] = $result;
}

И если вы хотите также изменить month_adops, как указано в вашем вопросе, просто добавьте дополнительный if :)

Andreas Schrammel 23.08.2018 13:32

Работал как шарм! Я добавил больше полей, это хорошая практика?

Asim 23.08.2018 13:32

Да, вы можете использовать, если у вас есть противоречивые данные.

Jasmin Mistry 23.08.2018 13:34

Как вы используете &$result, действительно ли вам нужен массив $result_replace?

Nigel Ren 23.08.2018 13:34

Попробуйте заменить

empty()

по

is_null()
    array_walk_recursive($array, function (&$value, $key){
        if (!isset($value) && ('month_spend' === $key || 'month_adops' === $key)) {
            $value = 0;
        }
    });

Это потенциально может установить для пустых строковых значений (например, month_comment) значение 0.

Nigel Ren 23.08.2018 13:36

Предполагая, что ваш массив - это имя $ myArray

foreach ($myArray as $key => $result) {
  if (empty($result['month_budget'])) {
       $myArray[$key]['month_budget'] = 0
  }
  if (empty($result['month_spend'])) {
         $myArray[$key]['month_spend'] = 0
  }
}

var_dump ($ myArray)

в вашем случае вы просто назначаете пустой массив $ result_replace больше ничего

  1. empty из 0 вернет false. Таким образом, ваш код будет избыточным с этой функцией. Попробуйте использовать is_integer. Если не целое число, присвойте ноль. Плохо то, что вы не можете избежать петли с foreach.

  2. можно ли избежать foreach из php, используя более конкретный запрос mysql, например, IF(ISNULL(your_column), 0, your_column).

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