Need to change some object values of a doctrine collection fetched from database and save again to the database. For this, there is a old written code and In that they have used a loop to save objects one by one. The reason of saving objects one by one is because there some other processes are done in the middle. In the end of the first loop there is a function which is trying to fetch another doctrine collection from the database. Now that entire collection is existed of db values. Because of that 1st collection is replaced by existing database values. So updating process is not working. Why is this happening ?
Example Code :
class mainAction extends sfAction {
function execute($request) {
$a = new ExampleA();
$collection = $a->updateDoctrineCollectionWithNewValues(6);
$b = new ExampleB();
$b->saveDoctrineCollectionToDB($collection);
}
}
class ExampleA {
function updateDoctrineCollectionWithNewValues($empNumber){
$empSalaryComponents = Doctrine_Core::getTable('EmployeeSalaryComponent');
$empSalComCollection = $empSalaryComponents->findBy('employee_number', $empNumber);
foreach ($empSalComCollection as $empSalComponent) {
$empSalComponent->setValue(9999999999999);
}
return $empSalComCollection;
}
}
class ExampleB {
function saveDoctrineCollectionToDB($doctrineCollection){
var_dump($doctrineCollection->toArray()); // 1st var_dump
foreach ($doctrineCollection as $object) {
$this->addToLogger($object);
var_dump($doctrineCollection->toArray()); //2nd var_dump
die;
}
}
function addToLogger($object) {
$empSalaryComponents = Doctrine_Core::getTable('EmployeeSalaryComponent')->findBy('employee_number', $object->getEmployeeNumber());
/**
* Do something
**/
}
}
Results
1st var_dump :
array (size=4)
0 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '1' (length=1)
'value' => int 9999999999999
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
1 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '2' (length=1)
'value' => int 9999999999999
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
2 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '3' (length=1)
'value' => int 9999999999999
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
3 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '4' (length=1)
'value' => int 9999999999999
'effectiveDate' => string '2019-01-19' (length=10)
'is_active' => string '1' (length=1)
2nd var_dump:
0 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '1' (length=1)
'value' => string '6787' (length=4)
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
1 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '2' (length=1)
'value' => string '71111' (length=5)
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
2 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '3' (length=1)
'value' => string '34%' (length=3)
'effectiveDate' => string '2019-01-15' (length=10)
'is_active' => string '1' (length=1)
3 =>
array (size=5)
'employee_number' => string '6' (length=1)
'salary_component_id' => string '4' (length=1)
'value' => string '6787' (length=4)
'effectiveDate' => string '2019-01-19' (length=10)
'is_active' => string '1' (length=1)
2nd var_dump is filled with db values since calling db in the middle of the loop.
Env : Doctrine 1.2, Php7.2, Symfony 1.4
I have an array:
array (size=3)
0 =>
array (size=3)
'quantity' => string '20' (length=2)
'date' => string '2016-01-01' (length=10)
'eID' => string '2' (length=1)
1 =>
array (size=3)
'quantity' => string '10' (length=2)
'date' => string '2016-03-01' (length=10)
'eID' => string '2' (length=1)
2 =>
array (size=3)
'quantity' => string '15' (length=2)
'date' => string '2016-01-01' (length=10)
'eID' => string '1' (length=1)
how can i fill missing date for each 'eID'? so the output would be:
array (
0 =>
array (
'quantity' => string '20' (length=2)
'date' => string '2016-01-01' (length=10)
'eID' => string '2' (length=1)
1 =>
array (
'quantity' => null
'date' => string '2016-02-01' (length=10)
'eID' => string '2' (length=1)
2 =>
array (
'quantity' => string '10' (length=2)
'date' => string '2016-03-01' (length=10)
'eID' => string '2' (length=1)
...until 2016-12-01. 12 arrays for each 'eID' key with same value
I have a few records from database and I fetched all records. The array return as the code below
array (size=10)
0 =>
array (size=5)
'id' => string '1' (length=1)
'type' => string 'group' (length=5)
'members' => null
'parents' => string '0' (length=1)
'level' => string '1' (length=1)
1 =>
array (size=5)
'id' => string '2' (length=1)
'type' => string 'group' (length=5)
'members' => null
'parents' => string '0' (length=1)
'level' => string '1' (length=1)
2 =>
array (size=5)
'id' => string '3' (length=1)
'type' => string 'team' (length=4)
'members' => string '["3","5","6"]' (length=13)
'parents' => string '1' (length=1)
'level' => string '2' (length=1)
3 =>
array (size=5)
'id' => string '4' (length=1)
'type' => string 'team' (length=4)
'members' => string '["1"]' (length=5)
'parents' => string '1' (length=1)
'level' => string '2' (length=1)
4 =>
array (size=5)
'id' => string '5' (length=1)
'type' => string 'group' (length=5)
'members' => null
'parents' => string '1' (length=1)
'level' => string '2' (length=1)
5 =>
array (size=5)
'id' => string '8' (length=1)
'type' => string 'team' (length=4)
'members' => string '["4"]' (length=5)
'parents' => string '5' (length=1)
'level' => string '3' (length=1)
6 =>
array (size=5)
'id' => string '9' (length=1)
'type' => string 'team' (length=4)
'members' => string '["2"]' (length=5)
'parents' => string '5' (length=1)
'level' => string '3' (length=1)
7 =>
array (size=5)
'id' => string '10' (length=2)
'type' => string 'team' (length=4)
'members' => null
'parents' => string '5' (length=1)
'level' => string '3' (length=1)
8 =>
array (size=5)
'id' => string '11' (length=2)
'type' => string 'team' (length=4)
'members' => null
'parents' => string '5' (length=1)
'level' => string '3' (length=1)
9 =>
array (size=5)
'id' => string '12' (length=2)
'type' => string 'group' (length=5)
'members' => null
'parents' => string '1' (length=1)
'level' => string '2' (length=1)
the members field has been encoded as json string. I want to build a array with format as the code below
array('1'=>array(1,2,3,4,5,6),
'2'=>array(),
'3'=>array(3,5,6),
'4'=>array(1),
'5'=>array(2,4),
'8'=>array(4),
'9'=>array(2))
The record's id will be key of array and the members has decoded will become the value. I wrote a function handle the array return from the database but the result not as my intention. This is my code
$results = mysql_query('select id,type,members,parents,level from team');
$array = array();
recursiveDate($results,0,$array);
function recursiveData($sourceArr,$parents = 0, &$newMenu){
if(count($sourceArr)>0){
foreach ($sourceArr as $key => $value){
if($value['parents'] == $parents){
if(isset($newMenu[$value['id']])){
$newMenu[$value['id']] = array();
}
$newMenu[$value['id']] = $value['members']?json_decode($value['members']):array();
if(isset($newMenu[$parents])){
$newMenu[$parents] = array_merge($newMenu[$value['id']],$newMenu[$parents]);
}
$newParents = $value['id'];
unset($sourceArr[$key]);
$this->recursiveData($sourceArr,$newParents, $newMenu);
}
}
}
}
And this is the array after handled
array (size=10)
1 =>
array (size=4)
0 => string '1' (length=1)
1 => string '3' (length=1)
2 => string '5' (length=1)
3 => string '6' (length=1)
3 =>
array (size=3)
0 => string '3' (length=1)
1 => string '5' (length=1)
2 => string '6' (length=1)
4 =>
array (size=1)
0 => string '1' (length=1)
5 =>
array (size=2)
0 => string '2' (length=1)
1 => string '4' (length=1)
8 =>
array (size=1)
0 => string '4' (length=1)
9 =>
array (size=1)
0 => string '2' (length=1)
10 =>
array (size=0)
empty
11 =>
array (size=0)
empty
12 =>
array (size=0)
empty
2 =>
array (size=0)
empty
Please help me build that array
I quickly wrote this so not sure if it's exactly what you're looking for, looks like you over complicated it hugely though. I kept the original result structure incase you wanted that but you can easily overwrite it if you wish.
function modifyData($data = array()) {
foreach($data as &$entry) {
if(!empty($entry['members'])) {
$entry['members'] = json_decode($entry['members'], true);
} else {
$entry['members'] = array();
}
}
return $data;
}
I tested this with
$data = array(
array(
'id' =>'1',
'type' =>'group',
'members' => null,
'parents' =>'0',
'level' =>'1'
),
array(
'id' =>'1',
'type' =>'group',
'members' => '["3","5","6"]',
'parents' =>'0',
'level' =>'1'
),
array(
'id' =>'1',
'type' =>'group',
'members' => '["3"]',
'parents' =>'0',
'level' =>'1'
)
);
And the output is
array (size=3)
0 =>
array (size=5)
'id' => string '1' (length=1)
'type' => string 'group' (length=5)
'members' =>
array (size=0)
empty
'parents' => string '0' (length=1)
'level' => string '1' (length=1)
1 =>
array (size=5)
'id' => string '1' (length=1)
'type' => string 'group' (length=5)
'members' =>
array (size=3)
0 => string '3' (length=1)
1 => string '5' (length=1)
2 => string '6' (length=1)
'parents' => string '0' (length=1)
'level' => string '1' (length=1)
2 =>
array (size=5)
'id' => string '1' (length=1)
'type' => string 'group' (length=5)
'members' =>
array (size=1)
0 => string '3' (length=1)
'parents' => string '0' (length=1)
'level' => string '1' (length=1)
I need to merge a multi-dimentional array so that after merging the new values will be equal to 0 instead of the original value.
$data = array(
0 => array(
'2009-05-12' => string '1' (length=1)
'2010-12-07' => string '8' (length=1)
'2010-12-02' => string '23' (length=2)
'2010-11-11' => string '16' (length=2)
'2010-09-01' => string '1' (length=1)
'2010-08-24' => string '1' (length=1)
'2010-06-30' => string '1' (length=1)
), 1 => array(
'2010-09-08' => string '1' (length=1)
'2011-11-28' => string '1' (length=1)
'2011-09-28' => string '3' (length=1)
'2011-09-21' => string '1' (length=1)
'2012-04-10' => string '21' (length=2)
'2012-04-02' => string '12' (length=2)
), 2 => array(
'2010-12-15' => string '12' (length=2)
'2010-12-08' => string '12' (length=2)
'2010-11-28' => string '12' (length=2)
'2010-06-30' => string '12' (length=2)
'2010-05-04' => string '1' (length=1)
'2011-12-21' => string '9' (length=1)
'2012-01-05' => string '23' (length=2)
), 3 => array(
'2010-12-14' => string '2' (length=1)
'2010-12-10' => string '4' (length=1)
'2010-11-29' => string '4' (length=1)
'2011-10-04' => string '7' (length=1)
'2011-09-27' => string '11' (length=2)
'2012-01-06' => string '1' (length=1)
)
);
What I succeeded to do was to create a loop that was merging elements in the array:
foreach($data as $index => $date){
foreach($data as $index2 => $date2)
$data[$index] = array_merge($data[$index2], $data[$index]);
}
The above script outputs almost the correct result, but the merged values should be equal to 0 and not to the original value.
The output of the above script merges each of the nested arrays so that it contains values of the all remaining nested arrays.
The output should be:
$data = array(
0 => array(
'2009-05-12' => string '1' (length=1)
'2010-12-07' => string '8' (length=1)
'2010-12-02' => string '23' (length=2)
'2010-11-11' => string '16' (length=2)
'2010-09-01' => string '1' (length=1)
'2010-08-24' => string '1' (length=1)
'2010-06-30' => string '1' (length=1)
'2010-09-08' => string '0' (length=1)
'2011-11-28' => string '0' (length=1)
'2011-09-28' => string '0' (length=1)
'2011-09-21' => string '0' (length=1)
'2012-04-10' => string '0' (length=1)
'2012-04-02' => string '0' (length=1)
'2010-12-15' => string '0' (length=1)
'2010-12-08' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-05-04' => string '0' (length=1)
'2011-12-21' => string '0' (length=1)
'2012-01-05' => string '0' (length=1)
'2010-12-14' => string '0' (length=1)
'2010-12-10' => string '0' (length=1)
'2010-11-29' => string '0' (length=1)
'2011-10-04' => string '0' (length=1)
'2011-09-27' => string '0' (length=1)
'2012-01-06' => string '0' (length=1)
), 1 => array(
'2009-05-12' => string '0' (length=1)
'2010-12-07' => string '0' (length=1)
'2010-12-02' => string '0' (length=1)
'2010-11-11' => string '0' (length=1)
'2010-09-01' => string '0' (length=1)
'2010-08-24' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-09-08' => string '1' (length=1)
'2011-11-28' => string '1' (length=1)
'2011-09-28' => string '3' (length=1)
'2011-09-21' => string '1' (length=1)
'2012-04-10' => string '21' (length=2)
'2012-04-02' => string '12' (length=2)
'2010-12-15' => string '0' (length=1)
'2010-12-08' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-05-04' => string '0' (length=1)
'2011-12-21' => string '0' (length=1)
'2012-01-05' => string '0' (length=1)
'2010-12-14' => string '0' (length=1)
'2010-12-10' => string '0' (length=1)
'2010-11-29' => string '0' (length=1)
'2011-10-04' => string '0' (length=1)
'2011-09-27' => string '0' (length=1)
'2012-01-06' => string '0' (length=1)
), 2 => array(
'2009-05-12' => string '0' (length=1)
'2010-12-07' => string '0' (length=1)
'2010-12-02' => string '0' (length=1)
'2010-11-11' => string '0' (length=1)
'2010-09-01' => string '0' (length=1)
'2010-08-24' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-09-08' => string '0' (length=1)
'2011-09-28' => string '0' (length=1)
'2011-09-21' => string '0' (length=1)
'2012-04-10' => string '0' (length=1)
'2012-04-02' => string '0' (length=1)
'2010-12-15' => string '12' (length=2)
'2010-12-08' => string '12' (length=2)
'2010-11-28' => string '12' (length=2)
'2010-06-30' => string '12' (length=2)
'2010-05-04' => string '1' (length=1)
'2011-12-21' => string '9' (length=1)
'2012-01-05' => string '23' (length=2)
'2010-12-14' => string '0' (length=1)
'2010-12-10' => string '0' (length=1)
'2010-11-29' => string '0' (length=1)
'2011-10-04' => string '0' (length=1)
'2011-09-27' => string '0' (length=1)
'2012-01-06' => string '0' (length=1)
), 3 => array(
'2009-05-12' => string '0' (length=1)
'2010-12-07' => string '0' (length=1)
'2010-12-02' => string '0' (length=1)
'2010-11-11' => string '0' (length=1)
'2010-09-01' => string '0' (length=1)
'2010-08-24' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-09-08' => string '0' (length=1)
'2011-09-28' => string '0' (length=1)
'2011-09-21' => string '0' (length=1)
'2012-04-10' => string '0' (length=1)
'2012-04-02' => string '0' (length=1)
'2010-12-15' => string '0' (length=1)
'2010-12-08' => string '0' (length=1)
'2010-11-28' => string '0' (length=1)
'2010-06-30' => string '0' (length=1)
'2010-05-04' => string '0' (length=1)
'2011-12-21' => string '0' (length=1)
'2012-01-05' => string '0' (length=2)
'2010-12-14' => string '2' (length=1)
'2010-12-10' => string '4' (length=1)
'2010-11-29' => string '4' (length=1)
'2011-10-04' => string '7' (length=1)
'2011-09-27' => string '11' (length=2)
'2012-01-06' => string '1' (length=1)
)
);
Just don't use array_merge.
foreach($data as $index => $v){
foreach($data as $data2){
foreach($data2 as $date=> $val){
if(!array_key_exist($date,$data[$index])){
$data[$index][$date] = 0;
}
}
}
}
I have a 2 dimension array with the help of Baba and now I am in problem again as I need to add [exam] => testOne and [exam_id] => 1 to all inner arrays
array
0 =>
array
'id' => string '7' (length=1)
'name' => string 'Name 1' (length=6)
'marks' => string '8' (length=1)
'grade' => string '4' (length=1)
1 =>
array
'id' => string '8' (length=1)
'name' => string 'Name 2' (length=6)
'marks' => string '5' (length=1)
'grade' => string '2.5' (length=3)
2 =>
array
'id' => string '9' (length=1)
'name' => string 'another name' (length=12)
'marks' => string '8' (length=1)
'grade' => string '4' (length=1)
I need to add
[exam] => testOne and [exam_id] => 1 to all inner arrays want results as follwing
array
0 =>
array
'exam_id' =>'1'
'exam' => 'testOne'
'id' => string '7' (length=1)
'name' => string 'Name 1' (length=6)
'marks' => string '8' (length=1)
'grade' => string '4' (length=1)
1 =>
array
'exam_id' =>'1'
'exam' => 'testOne'
'id' => string '8' (length=1)
'name' => string 'Name 2' (length=6)
'marks' => string '5' (length=1)
'grade' => string '2.5' (length=3)
2 =>
array
'exam_id' =>'1'
'exam' => 'testOne'
'id' => string '9' (length=1)
'name' => string 'another name' (length=12)
'marks' => string '8' (length=1)
'grade' => string '4' (length=1)
This is such a great place for learners like me.
You can try
foreach ( $final as &$var ) {
$var['exam'] = "testOne";
$var['exam_id'] = "1";
}
var_dump($final);
If you want to retain the keys on top (As Requested)
$addOn = array("exam" => "testOne","exam_id" => 1);
end($addOn);
foreach ( $final as &$var ) {
$var = array_merge($addOn, $var);
}
var_dump($final);