Как лучше избавиться от Notice: undefined index

Yaponchick

Новичок
Здравствуйте.

На-до-е-ло!

PHP:
if (!isset($array[$typeName)) {
  $array[$typeName] = array(
    "batches" => 0,
    "units" => 0,
    "oreVolume" => 0,
    "time" => 0,
    "timeRemaining" => "",
  );
}
Писать эти проверки на существование индекса. Есть ли вариант кроме @ и классов, сделать значения по умолчанию? ))

Сейчас плюнул, и вспомнил детство:
PHP:
@$result[$material["oreTypeName"]]["oreTypeName"] = $material["oreTypeName"];
@$result[$material["oreTypeName"]]["batches"] += $batches;
@$result[$material["oreTypeName"]]["units"] += $units;
@$result[$material["oreTypeName"]]["oreVolume"] += $volume;
@$result[$material["oreTypeName"]]["time"] += $time;
@$result[$material["oreTypeName"]]["timeRemaining"] = timeRemaining($result[$material["oreTypeName"]]["time"]);
 

WMix

герр M:)ller
Партнер клуба
надо понять откуда береться этот
PHP:
$result[$material["oreTypeName"]]
а дальше будет проще
 

Yaponchick

Новичок
PHP:
<?php

// $originalTypeID == INT
function reprocess($originalTypeID) {
  $result = array();

  $data = $db->fetchAll("SELECT * FROM `reprocessed_materials` WHERE `originalTypeID` = ?;", array(
    $originalTypeID
  ));

  foreach ($data as $material) {
    $units = $material["units"];
    $volume = $material["oreVolume"] * $material["oreWeight"];
    $batches = ceil($units / $material["perBatch"]);
    $time = ceil($volume / 5200);
    
    @$result[$material["oreTypeName"]]["oreTypeName"] = $material["oreTypeName"];
    @$result[$material["oreTypeName"]]["batches"] += $batches;
    @$result[$material["oreTypeName"]]["units"] += $units;
    @$result[$material["oreTypeName"]]["oreVolume"] += $volume;
    @$result[$material["oreTypeName"]]["time"] += $time;
    @$result[$material["oreTypeName"]]["timeRemaining"] = timeRemaining($result[$material["oreTypeName"]]["time"]);
  }

  return $result;
}

?>
Гемора не было бы, если в $data не попадались одинаковые ["oreTypeName"], а их нужно объединять...

SQL запрос менять нельзя, а-ля GROUP BY + SUM(col1) + SUM(col2) + SUM(col3) ибо кол-во полей не определено.

var_dump массива: http://pastie.org/private/qyywx1hl84pweuyd7uhhua
Как видно, Kernite & Pyroxeres повторяется дважды -.-
 

WMix

герр M:)ller
Партнер клуба
ну если запрос не хочешь менять, то вспоминай детство!
PHP:
SELECT 
	oreTypeName,
	sum(ceil(units / perBatch)) as batches,
	sum(units) as units,
	sum(oreVolume *  oreWeight) as oreVolume,
	sum( ceil(oreVolume *  oreWeight / 5200) ) as time
FROM `reprocessed_materials` 
WHERE `originalTypeID` = ?
group by oreTypeName;
колво полей гдето определено, и если уже то можно создать динамический эСКуэЛ
 

radioheaded

PHP нуб
Ну вы можете предварительно пробежаться аналогичным циклом и проинициализировать нужную структуру result. Но на самом деле, не вижу ничего страшного в проверке существования индекса.
 

Yaponchick

Новичок
radioheaded
Через каждые 30 строк кода у меня получается по 2-4:
PHP:
if (!isset($array[$index)) {
  $array[$index] = array();
}
Так что это уже пугает )
 

radioheaded

PHP нуб
radioheaded
Через каждые 30 строк кода у меня получается по 2-4:
PHP:
if (!isset($array[$index)) {
  $array[$index] = array();
}
Так что это уже пугает )
Вас должна пугать не проверка индекса, а копипаста, которую вы усиленно плодите. Найдите общую часть, напишите функцию, которая будет обрабатывать подобные случаи.
 

С.

Продвинутый новичок
Pestilence, я тебе сейчас скажу одну неправославную вещь (только ты тс-с-с, никому). Есть целая секта, которая пишет на РНР с ортключенными нотисами.
 

Yaponchick

Новичок
radioheaded Статистика... зло ) Нет там ничего общего =)
С. да я уже думал об этом, но стрёмно вааащеее )))) Ведь отсутствие нотисов даёт некий слой безопасности, что это не ты напортачил ;)
 

radioheaded

PHP нуб
radioheaded Статистика... зло ) Нет там ничего общего =)
С. да я уже думал об этом, но стрёмно вааащеее )))) Ведь отсутствие нотисов даёт некий слой безопасности, что это не ты напортачил ;)
Если там нет ничего общего, то почему вам надоело писать одно и то же?
 

Yaponchick

Новичок
Ибо структура органзиации данных для разных таблиц является разной, но суть одна, нужны массивы с дефолтными значениями, и единственный выход, это функция которые сгенерит их или а-ля
PHP:
function setArrayValuesWithDefaults(&$array, $key, $subKey, $value) { if (!isset($array[$key]) { $array[$key] = array(); }; $array[$key][$subKey] = $value; }
. Что по сути является тем же @...
 

С.

Продвинутый новичок
С. да я уже думал об этом, но стрёмно вааащеее )))) Ведь отсутствие нотисов даёт некий слой безопасности, что это не ты напортачил ;)
Так а как ты хотел? Что-то за что-то.

Стремного там ничего, ты вудешь не первый и не последний. Это просто смена психологического подхода к программированию. Кроме того код от этого становится чище, читабильней и соответственно порождает меньше ошибок. Тупые описки бывают, но они быстро локализуются, если код чист,опрятен и семантичен в целом.
 

Вурдалак

Продвинутый новичок
Это просто смена психологического подхода к программированию. Кроме того код от этого становится чище, читабильней и соответственно порождает меньше ошибок. Тупые описки бывают, но они быстро локализуются, если код чист,опрятен и семантичен в целом.
Видимо у вас так заведено и ты оправдываешься? :)
 

С.

Продвинутый новичок
Скорее это ты завидуешь, что у вас такого не заведено.
 

fixxxer

К.О.
Партнер клуба
Pestilence
он либо шутит, либо идиот.
у меня (да вобщем то как и во всех фреймворках) на notice кидается exception и это очень помогает, отключишь - не будешь сразу видеть 99% косяков типа опечаток

никаких проблем с setArrayValuesWithDefaults не вижу. это не то же что @
 

weregod

unserializer
C., я самостоятельно выработал требование к себе и остальным разработчикам девелопить с включенными нотисами
это уменьшает вероятность опечаток и повышает требования к качеству кода, что в том плохого?
 

Вурдалак

Продвинутый новичок
Вурдалак, я самостоятельно выработал требование к себе и остальным разработчикам девелопить с включенными нотисами
это уменьшает вероятность опечаток и повышает требования к качеству кода, что в том плохого?
Ты, наверное, хотел это адресовать С., верно?
 
Сверху