Ваша проблема в том, что вы сбрасываете массив на каждой итерации цикла. Переместите его за пределы foreach
, вот так:
$dados[] = array('cd_driver' => $cd_driver, 'Driver' => $RSx["ds_name"], 'month' => $cd_month, 'bsaldo' => $saldoToJson);
$dados2 = array('cd_driver' => $cd_driver, 'Driver' => $RSx["ds_name"], 'month' => $cd_month, 'bsaldo' => $saldoToJson);
$jsonString = file_get_contents('bsaldo.json');
$data = json_decode($jsonString, true);
if($data == ""){
$newString = json_encode($dados);
file_put_contents('bsaldo.json', $newString);
}else {
$array = array(); # here it won't be continually reset and can accumulate values as intended.
foreach ($data as $key => $value) {
$mot = $value['cd_driver'];
array_push($array, $mot);
if(in_array($cd_driver, $array)){
$data[$key]['month'] = $cd_month;
$newString = json_encode($data);
file_put_contents('bsaldo.json', $newString);
}else {
array_push($data, $dados2);
$finalString = json_encode($data);
file_put_contents('bsaldo.json', $finalString);
}
}
}
Если бы я понимаю вопрос, то наиболее распространенный подход должен был бы объявить неуниверсальный основной интерфейс, т.е.
internal interface IRelativeTo
{
object getRelativeTo(); // or maybe something else non-generic
void setRelativeTo(object relativeTo);
}
internal interface IRelativeTo<T> : IRelativeTo
where T : IObject
{
new T getRelativeTo();
new void setRelativeTo(T relativeTo);
}
, Другая опция для Вас для кодирования в основном в дженериках..., т.е. у Вас есть методы как
void DoSomething<T>() where T : IObject
{
IRelativeTo<IObject> foo = // etc
}
, Если эти IRelativeTo<T>
аргумент DoSomething()
, то обычно Вы не должны определять общий аргумент типа сами - компилятор выведет его - т.е.
DoSomething(foo);
, а не
DoSomething<SomeType>(foo);
существуют преимущества для обоих подходов.
к сожалению, наследование не работает с дженериками. Если Ваша функция ожидает IRelativeTo, можно сделать функциональный дженерик также:
void MyFunction<T>(IRelativeTo<T> sth) where T : IObject
{}
, Если я помню правильно, когда Вы используете функцию выше Вас, не должны даже определять тип, компилятор должен понять его на основе аргумента, который Вы предоставляете.
, Если Вы хотите сохранить ссылку на один из этих объектов IRelativeTo в классе или методе (и Вы не заботитесь о том, что T - то, что), необходимо сделать этот класс/метод универсальным снова.
я соглашаюсь, это - немного боли.
Если все, о чем Вы заботитесь, - то, что IRelativeTo имеет дело с IObjects тогда, Вы не должны делать его универсальным:
interface IRelativeTo
{
IObject getRelativeTo();
void setRelativeTo(IObject relativeTo)
}
классы с реализацией могут все еще быть универсальными, однако:
abstract class RelativeTo<T> : IRelativeTo where T : IObject
{
public virtual T getRelativeTo() {return default(T);}
public virtual void setRelativeTo(T relativeTo) {}
IObject IRelativeTo.getRelativeTo() {return this.getRelativeTo(); }
void IRelativeTo.setRelativeTo(IObject relativeTo)
{ this.setRelativeTo((T) relativeTo);
}
}
class AdminRateShift : RelativeTo<AdminRateShift>, IObject {}
Тогда можно сделать это:
IRelativeTo irt = new AdminRateShift();
IObject o = irt.getRelativeTo();
irt.setRelativeTo(o);