Перейти к содержимому


Динамические ключи в $line


Сообщений в теме: 13

#1 sxquer

    Активный участник

  • Пользователи
  • PipPipPip
  • 33 сообщений

Отправлено 13 Июнь 2014 - 06:50

Необходимо динамически менять ключи в переменной $line.

Вариант 1.
$type = array(
"resp_name" => "<здесь имя поля, например 'Ответственный'>"
);
echo $line[$type['resp_name']]['Бонусный счет']['id'];


Возвращает пустоту.
Судя по всему перед выполнением кода КБ подменяет в куске кода Имя поля на его табличное имя fXXXX, а так как у меня в коде имя явно не указано, подмена не происходит.

Вариант 2.
$type = array(
"resp_name" => "<здесь имя поля в БАЗЕ ДАННЫХ, например 'f9856'>"
);
echo $line[$type['resp_name']]['Бонусный счет']['id'];


Возвращает ошибку "Cannot use string offset as an array".

Вопрос знатокам - что я делаю не так?

Вот код вычисления, где возникла ошибка
$fields = array
(
"Отправитель" => "f5411",
"Получатель" => "f5421",
"Дата" => "f5431",
"Сумма" => "f5531",
"Основание" => "f5441",
"Заказ" => "f5501",
"Запчасть" => "f5511"
);
$bonus_fields = array(
"find" => array(
  "transaction_name" => "f5931",
  "resp_name" => "f5881",
  "sum_name" => "f5241",
  "bonus_for" => "поиск"
),

"buy" => array(
  "transaction_name" => "f5871",
  "resp_name" => "f5891",
  "sum_name" => "f5251",
  "bonus_for" => "покупку"
),

 
"pack" => array(
  "transaction_name" => "f5941",
  "resp_name" => "f5901",
  "sum_name" => "f5261",
  "bonus_for" => "упаковку"
),

"send" => array(
  "transaction_name" => "f5951",
  "resp_name" => "f5911",
  "sum_name" => "f5271",
  "bonus_for" => "отправку"
)
);
foreach ($bonus_fields as $type)
{
$tran = intval($line[$type['transaction_name']]['ID']);
$resp_exists = intval($line[$type['resp_name']]['ID']) != 0;

if (!$resp_exists && $tran != 0)
{
  data_delete(451, EVENTS_ENABLE, "id={$tran}");
  $line[$type['transaction_name']] = null;
}

if ($resp_exists)
{
   if ($tran == 0)
  {
  
   //Исправить на динамически выбираемый
   $data[$fields['Отправитель']] = $line['Заказ']['К какой компании относится заказ']['Счет']['ID'];
   $data[$fields['Получатель']] = $line[$type['resp_name']]['Бонусный счет']['ID'];
   $data[$fields['Дата']] = date("Y-m-d h:i:s");
   $data[$fields['Сумма']] = $line[$type['sum_name']];
   $data[$fields['Основание']] = "Бонус за {$type['bonus_for']} {$line['Название']['Название']}";
   $data[$fields['Заказ']] = $line['Заказ']['ID'];
   $data[$fields['Запчасть']] = $line['ID'];
   $line[$type['transaction_name']] = data_insert(451, EVENTS_ENABLE, $data);
  
  }
  else
  {
   $data[$fields['Получатель']] = $line[$type['resp_name']]['Бонусный счет']['ID'];
   $data[$fields['Сумма']] = $line[$type['sum_name']];
   data_update(451, EVENTS_ENABLE, $data, "id={$tran}");
  }
}
}

Сообщение отредактировал sxquer: 13 Июнь 2014 - 06:57


#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 14 Июнь 2014 - 15:25

Цитата

Судя по всему перед выполнением кода КБ подменяет в куске кода Имя поля на его табличное имя fXXXX

Да, только не перед выполнением, а при сохранении кода в редакторе вычислений. Поэтому 1-й вариант заведомо неверный, но и 2-й некорректен, т.к. у вас не происходит замены "Бонусный счет" на fXXXX при сохранении из-за использования переменной на первом уровне массива. В данном случае необходимо везде использовать внутренние имена полей, т.е. $line[$type['resp_name']]['f1111']['id'], где f1111 - внутреннее имя поля "Бонусный счет". Т.е. общее правило - либо используете внешние имена на всех уровнях и без переменных, либо везде - только внутренние.

#3 sxquer

    Активный участник

  • Пользователи
  • PipPipPip
  • 33 сообщений

Отправлено 17 Июнь 2014 - 08:10

Ошибка в вычислении.

Запчасти.Изменение суммы заказа
Заявки.Отображение поля: Баланс по заказу
Запчасти.Транзакции: бонусы :

62: $data[$fields['Отправитель']] = $line['f3921']['f5921']['f5521']['id'];
63: $data[$fields['Получатель']] = $line[$type['resp_name']]['f5841']['id'];
64: $data[$fields['Дата']] = date("Y-m-d h:i:s");
Cannot use string offset as an array

Не взлетело =). Что еще может быть?

Сообщение отредактировал sxquer: 17 Июнь 2014 - 08:10


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 17 Июнь 2014 - 12:03

А это уже не возвращает ошибки?

$type = array(
"resp_name" => "<здесь имя поля в БАЗЕ ДАННЫХ, например 'f9856'>"
);
echo $line[$type['resp_name']]['f5841']['id'];


#5 sxquer

    Активный участник

  • Пользователи
  • PipPipPip
  • 33 сообщений

Отправлено 17 Июнь 2014 - 12:51

То был вымышленный пример, реальный код в последнем абзаце первого поста.
Проверил echo:

Ошибка в вычислении.


Запчасти.Изменение суммы заказа
Запчасти.Отображение поля: Себестоимость
Запчасти.Отображение поля: Чистая прибыль
Запчасти.Транзакции: бонусы :

46:
47: echo $line[$type['resp_name']]['f5841']['id'];
48: die;
Cannot use string offset as an array


#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 17 Июнь 2014 - 13:31

В реальном коде может быть ошибка из-за неверного указанного/подставленного имени поля. Проверяйте код, в том числе значения $type['resp_name']. Сообщение об ошибке говорит о неверно указанном ключе массива, т.е. такого ключа нет в $line.

#7 sxquer

    Активный участник

  • Пользователи
  • PipPipPip
  • 33 сообщений

Отправлено 18 Июнь 2014 - 02:20

Перепроверил - все ключи верные.
Насколько я понимаю - php интерпретирует $line[$type['resp_name']] как строку, а не как массив, поэтому и возникает ошибка.
Она возникает в случаях, в случаях, когда от строки попытаться два раза смещение взять/

Вот пример:
$array = array(
"lvl_1" =&gt; array(
   "lvl_2" =&gt; "value"
  )
);
$string = "This is a string";
echo "Array with correct keys";
echo "<br>";
echo $array["lvl_1"]["lvl_2"];
echo "<br>";
echo "Array with INcorrect keys";
echo "<br>";
echo $array["doesn't exist"]["lvl_2"];
echo "<br>";
echo "String with double offset";
echo $string[0][0];

Возвращает:
Array with correct keys
value
Array with INcorrect keys
String with double offset
Fatal error: Cannot use string offset as an array

Сообщение отредактировал sxquer: 18 Июнь 2014 - 02:21


#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 18 Июнь 2014 - 10:24

Затрудняюсь тогда пока сказать, в чем конкретно проблема. Теоретически, это может быть и ограничение механизма вычислений, т.е. в случае с вложенными ключами переменные не работают. Но точно не знаю, тестировать надо.

#9 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 29 Октябрь 2015 - 09:03

Задача аналогичная. Есть необходимость обращаться к полям в цикле c переменной в качестве ключа $line[$i]. Существует такая возможность?

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения


#10 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Октябрь 2015 - 09:10

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

#11 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 29 Октябрь 2015 - 11:51

Просмотр сообщенияCbCoder (29 Октябрь 2015 - 09:10) писал:

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

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения


#12 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Октябрь 2015 - 11:55

Что подставляете через переменную? Внутреннее бд-имя? Тогда не работать может только в случае, если такого поля нет.

#13 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 29 Октябрь 2015 - 12:11

Просмотр сообщенияCbCoder (29 Октябрь 2015 - 11:55) писал:

Что подставляете через переменную? Внутреннее бд-имя? Тогда не работать может только в случае, если такого поля нет.
В том то и дело, что внешние. Поля имеют имена в виде чисел: 1, 2, 3 и т.д. Удобно перебирать циклом, обращаясь именно к внешним именам полей. Редактор при сохранении, естественно, пытается конвертировать $line[$i] как строку и возникает ошибка.

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения


#14 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Октябрь 2015 - 13:02

Так я же в начале темы писал, что это в принципе невозможно, т.к. массив $line оперирует исключительно с внутренними именами. Внешние имена отображаются только в редакторе, для лучшей читабельности.





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных