Cakephp 2 hash function to generate a new array - cakephp-2.0

Hi i do receive an array in this format :
array (size=2)
0 =>
array (size=1)
22 => string 'One string' (length=20)
1 =>
array (size=1)
8 => string 'Another string' (length=17)
How can i use cakephp hash to create another array usign 8 and 22 as indexes :
array (size=2)
22 => string 'One string' (length=20)
8 => string 'Another string' (length=17)
I try hash::nest but the result is :
array (size=2)
0 =>
array (size=3)
0 => string 'One string' (length=17)
'children' =>
array (size=0)
empty
1 => string 'Another string' (length=20)
1 =>
array (size=3)
0 => string 'One string' (length=17)
'children' =>
array (size=0)
empty
1 => string 'Another string' (length=20)

This can be done with Hash::merge
$formattedArray = Hash::merge($array[0], $array[1]);

Related

PHP Why is only one array returned in multidimensional array after a foreach

So im trying to make a multidimensional array, inserting dates under their day. However the days only show one of their dates coming from the database. It also looks like its repeating itself. Eventually my goal is to get all dates under their respected day.
What I tried:
-array_push, trying to push the new data in the array.-A for loop
The code for handling
$currentDate = new Date();
$month = $currentDate->getCurrentDate()->format("m");
$year = $currentDate->getCurrentDate()->format("Y");
$availableCollection = new AvailabilitiesCollection();
try {
$availableCollection->add(Availability::getByMonthAndYear($this->db, $month, $year));
$availabilities = $availableCollection->get();
foreach ($availabilities as $this->availability ){
$this->date = new \DateTime($this->availability['date']);
$this->dayLabel = $this->date->format('D');
$this->dataDb[] = $this->dayLabel;
}
$count = array_count_values($this->dataDb);
foreach ($availabilities as $this->availability) {
$this->date = new \DateTime($this->availability['date']);
$this->dayLabel = $this->date->format('D');
$this->insertAvailabilityInDays[$this->dayLabel] = array();
$availableData = array(
'id' => $this->availability['reservation_id'],
'date' => $this->availability['date'],
'start_at' => $this->availability['start_at'],
'end_at' => $this->availability['end_at']
);
array_push($this->insertAvailabilityInDays[$this->dayLabel], $availableData);
// for($i = 0; $i < $count[$this->dayLabel]; $i++){
// $availableData = array(
// 'id' => $this->availability['reservation_id'],
// 'date' => $this->availability['date'],
// 'start_at' => $this->availability['start_at'],
// 'end_at' => $this->availability['end_at']
// );
//
// array_push($this->insertAvailabilityInDays[$this->dayLabel], $availableData);
// }
var_dump($this->insertAvailabilityInDays);
continue;
}
// var_dump($this->insertAvailabilityInDays);
// exit;
} catch (\Exception $e) {
$this->logger->error($e);
}
The data in my db:
+----------------+------------+----------+--------+
| reservation_id | date | start_at | end_at |
+----------------+------------+----------+--------+
| 6 | 2020-01-22 | 12:30 | 12:45 |
| 7 | 2020-01-20 | 12:50 | 13:00 |
| 8 | 2020-01-22 | 15:45 | 16:00 |
| 9 | 2020-01-21 | 14:45 | 15:00 |
+----------------+------------+----------+--------+
My current output:
array (size=1)
'Wed' =>
array (size=4)
'id' => string '6' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '12:30:00' (length=8)
'end_at' => string '12:45:00' (length=8)
/var/source/app/classes/System/Handlers/CalendarHandler.php:87:
array (size=2)
'Wed' =>
array (size=4)
'id' => string '6' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '12:30:00' (length=8)
'end_at' => string '12:45:00' (length=8)
'Mon' =>
array (size=4)
'id' => string '7' (length=1)
'date' => string '2020-01-20' (length=10)
'start_at' => string '12:50:00' (length=8)
'end_at' => string '13:00:00' (length=8)
/var/source/app/classes/System/Handlers/CalendarHandler.php:87:
array (size=2)
'Wed' =>
array (size=4)
'id' => string '8' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '15:45:00' (length=8)
'end_at' => string '16:00:00' (length=8)
'Mon' =>
array (size=4)
'id' => string '7' (length=1)
'date' => string '2020-01-20' (length=10)
'start_at' => string '12:50:00' (length=8)
'end_at' => string '13:00:00' (length=8)
/var/source/app/classes/System/Handlers/CalendarHandler.php:87:
array (size=3)
'Wed' =>
array (size=4)
'id' => string '8' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '15:45:00' (length=8)
'end_at' => string '16:00:00' (length=8)
'Mon' =>
array (size=4)
'id' => string '7' (length=1)
'date' => string '2020-01-20' (length=10)
'start_at' => string '12:50:00' (length=8)
'end_at' => string '13:00:00' (length=8)
'Tue' =>
array (size=4)
'id' => string '9' (length=1)
'date' => string '2020-01-21' (length=10)
'start_at' => string '14:45:00' (length=8)
'end_at' => string '15:00:00' (length=8)
I`m expecting that every date goes in the array with their day. Together with its database information.
E.g:
'Wed' =>
array (size=4)
0 =>
'id' => string '6' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '12:30:00' (length=8)
'end_at' => string '16:45:00' (length=8)
1 =>
'id' => string '8' (length=1)
'date' => string '2020-01-22' (length=10)
'start_at' => string '15:45:00' (length=8)
'end_at' => string '16:00:00' (length=8)
Like #TomShaw mentioned, indeed changing $this->insertAvailabilityInDays[$this->dayLabel][] = $availableData fixed the problem.

Issue while looping an array in laravel view

Hi i have 2 arrays returned from a controller.
$order
array (size=2)
0 =>
array (size=2)
'orderid' => int 1
'ostatus' => string 'Placed' (length=6)
1 =>
array (size=2)
'orderid' => int 4
'ostatus' => string 'Placed' (length=6)
$orderdetails
array (size=2)
1 =>
array (size=3)
0 =>
array (size=3)
'oid' => int 1
'img6_path' => string 'images/product-list/pro1-list.jpg' (length=33)
'brand_name' => string 'Puma' (length=4)
1 =>
array (size=3)
'oid' => int 1
'img6_path' => string 'images/product-list/pro2-list.jpg' (length=33)
'brand_name' => string 'DressBerry' (length=10)
2 =>
array (size=3)
'oid' => int 1
'img6_path' => string 'images/product-list/pro3-list.jpg' (length=33)
'brand_name' => string 'United Colors of Benetton' (length=25)
4 =>
array (size=1)
0 =>
array (size=2)
'oid' => int 4
'img6_path' => string 'images/product-list/pro4-list.jpg' (length=33)
'brand_name' => string 'Puma' (length=4)
I am trying to print it in this order:
This is what i have been doing:
foreach($order as $ord)
//printing order id
foreach($orderdetail as $od)
foreach($od as $x)
//printing the products
endforeach()
endforeach()
endforeach()
But this is printing
orderid 1 with 3 products
orderid 1 with 1 product (That belonged to orderid 4)
orderid 4 with 3 products (That belonged to orderid 1)
orderid 4 with 1 product
Can anyone tell me how should i loop through the array so that after printing the first 3 products in order1 the loop breaks out and then print the 1 product in order 4 (Like in the picture above). Thanks
#foreach($order as $ord)
//printing order id
#foreach($orderdetail[$ord->orderid] as $od)
#foreach($od as $x)
//printing the products
#endforeach
#endforeach
#endforeach
where #foreach($orderdetail[$ord->orderid] as $od) is the big change... I would give this a try...

Cakephp - SQL not being generated for all records being inserted

I have the following code in my controller to insert records.
//Perform Inserts
$success = true;
foreach($toinsertrecords as $toinsertrecord) {
$this->BillingCenterDetail->create();
if (!$this->BillingCenterDetail->save($toinsertrecord)) {
$success = false;
echo "insert fail";
} else {echo "insert success";}
}
if ($troubleshoot) {
$log = $this->BillingCenterDetail->getDataSource()->getLog(false, false);
echo "<pre>Output from Datasource Log";
var_dump($log);
echo "</pre>";
}
The array being looped at, has the following contents (Note that the last record has the field order slightly switched, but as this is an associative array, i thought it should not matter)
array (size=3)
0 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'startdate' => string '2014-03-10' (length=10)
'enddate' => string '2014-03-10' (length=10)
'billing_center_id' => string '50' (length=2)
'isactive' => boolean false
'addr1' => string 'melbourne' (length=9)
'addr2' => string 'melbourne' (length=9)
'addr3' => string 'melbourne' (length=9)
'city' => string 'melbourne' (length=9)
'postcode' => string '777' (length=3)
'country' => string 'aus' (length=3)
'email' => string 'a#a.com' (length=7)
'phone' => string '1234' (length=4)
1 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'startdate' => string '2014-03-12' (length=10)
'enddate' => string '2028-12-10' (length=10)
'billing_center_id' => string '50' (length=2)
'isactive' => boolean false
'addr1' => string 'melbourne' (length=9)
'addr2' => string 'melbourne' (length=9)
'addr3' => string 'melbourne' (length=9)
'city' => string 'melbourne' (length=9)
'postcode' => string '777' (length=3)
'country' => string 'aus' (length=3)
'email' => string 'a#a.com' (length=7)
'phone' => string '1234' (length=4)
2 =>
array (size=1)
'BillingCenterDetail' =>
array (size=12)
'billing_center_id' => string '50' (length=2)
'startdate' => string '2014-03-11' (length=10)
'enddate' => string '2014-03-11' (length=10)
'isactive' => string '1' (length=1)
'addr1' => string 'test' (length=4)
'addr2' => string 'test' (length=4)
'addr3' => string 'test' (length=4)
'city' => string 'test' (length=4)
'postcode' => string 'test' (length=4)
'country' => string 'test' (length=4)
'email' => string 'test#test' (length=9)
'phone' => string 'test' (length=4)
This is the output from my getDataSource()->getLog statement
Output from Datasource Log
array (size=3)
'log' =>
array (size=4)
0 =>
array (size=5)
'query' => string 'SELECT `BillingCenterDetail`.`id`, `BillingCenterDetail`.`startdate`, `BillingCenterDetail`.`enddate`, `BillingCenterDetail`.`billing_center_id`, `BillingCenterDetail`.`isactive`, `BillingCenterDetail`.`addr1`, `BillingCenterDetail`.`addr2`, `BillingCenterDetail`.`addr3`, `BillingCenterDetail`.`city`, `BillingCenterDetail`.`postcode`, `BillingCenterDetail`.`country`, `BillingCenterDetail`.`email`, `BillingCenterDetail`.`phone`, `BillingCenterDetail`.`created`, `BillingCenterDetail`.`modified` FROM `bm`.`bil'... (length=718)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
1 =>
array (size=5)
'query' => string 'BEGIN' (length=5)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
2 =>
array (size=5)
'query' => string 'INSERT INTO `bm`.`billing_center_details` (`startdate`, `enddate`, `billing_center_id`, `isactive`, `addr1`, `addr2`, `addr3`, `city`, `postcode`, `country`, `email`, `phone`, `modified`, `created`) VALUES ('2014-03-10', '2014-03-11', 50, '0', 'melbourne', 'melbourne', 'melbourne', 'melbourne', '777', 'aus', 'a#a.com', '1234', '2014-03-11 15:47:15', '2014-03-11 15:47:15')' (length=374)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
3 =>
array (size=5)
'query' => string 'INSERT INTO `bm`.`billing_center_details` (`startdate`, `enddate`, `billing_center_id`, `isactive`, `addr1`, `addr2`, `addr3`, `city`, `postcode`, `country`, `email`, `phone`, `modified`, `created`) VALUES ('2014-03-13', '2028-12-10', 50, '0', 'melbourne', 'melbourne', 'melbourne', 'melbourne', '777', 'aus', 'a#a.com', '1234', '2014-03-11 15:47:15', '2014-03-11 15:47:15')' (length=374)
'params' =>
array (size=0)
...
'affected' => int 1
'numRows' => int 1
'took' => float 0
'count' => int 4
'time' => float 0
You can clearly see that it has only tried to insert the first 2 records, but for some reason it hasn't inserted the 3rd record. Based on the log, it also didn't generate the 3rd Insert SQL statement?
By the time it hits the 3rd loop, the "Save" function fails, this causes $success = false in the end.
Can anyone guess why this is happening?
My guess is the data in the third entry isn't passing validation.
Possibly your model has the postcode field as numeric only? In that case this data will fail:
'postcode' => string 'test' (length=4)
To debug this, I'd add this line inside your existing failure routine:
var_dump($this->BillingCenterDetail->invalidFields());

In codeigniter, how to pass array to function parameter

As title, I have a library function $this->foo->bar(). How can I pass $upload_data array to $this->foo->bar() param?
I have this in my controller
$upload_data = $this->upload->data();
//$upload_data['file_name']
$this->foo->bar($upload_data);
Then I have this in my library
public function bar($arr){
$config['source_name'] = //How can I use $arr['file_name'] in here
}
And I got this error
Message: Illegal string offset 'file_name'
var_dump($upload_data)
array (size=14)
'file_name' => string '1358459309.JPG' (length=14)
'file_type' => string 'image/jpeg' (length=10)
'file_path' => string 'C:/wamp/www/foldering/assets/img/uploaded_photos/' (length=49)
'full_path' => string 'C:/wamp/www/foldering/assets/img/uploaded_photos/1358459309.JPG' (length=63)
'raw_name' => string '1358459309' (length=10)
'orig_name' => string '1358459309.JPG' (length=14)
'client_name' => string '200X CNY1.JPG' (length=13)
'file_ext' => string '.JPG' (length=4)
'file_size' => float 30.87
'is_image' => boolean true
'image_width' => int 640
'image_height' => int 480
'image_type' => string 'jpeg' (length=4)
'image_size_str' => string 'width="640" height="480"' (length=24)
My mistake, issue comes from another function

Retireving data from arrays

I have this data spited out from my cake php query.. This is the problem.. How can i retrieve this data so that it fits this structure. How can I do this in my view?, I am just having trouble understanding how to retrieve each value
so this part I want it in a <p></p> in my page
array
'id' => string '1' (length=1)
'category_name' => string 'Appetizers' (length=10)
'category_keywords' => string 'appetizer, appetizers' (length=21)
'category_title' => string 'Our Side Dishes' (length=15)
'category_info' => string 'Hello This is the category info' (length=30)
'dish_id' => string '1' (length=1)
This other part returned of the query i want to put it in a 3 x 2 table. like
<table>
<tr>
<td> the data from the array 0</td>
<td> the data from the array 1</td>
<td> the data from the array 2>/td>
</tr>
<tr>
<td> the data from the array 3</td>
<td> the data from the array 4</td>
<td> the data from the array 5>/td>
</tr>
here are all the those arrays. I would like to use a for loop with a mod if 3 %== 0 and then create a new <tr>, i tried it but it gave me an error...
array
'id' => string '1' (length=1)
'category_name' => string 'Appetizers' (length=10)
'category_keywords' => string 'appetizer, appetizers' (length=21)
'category_title' => string 'Our Side Dishes' (length=15)
'category_info' => string 'Hello This is the category info' (length=441)
'dish_id' => string '1' (length=1)
array
0 =>
array
'id' => string '1' (length=1)
'dish_name' => string 'Arepa Con Pollo!' (length=16)
'dish_disc' => string 'Exquisite corn patti, the best yyy' (length=34)
'dish_price' => string '2.90' (length=4)
'dish_image' => string '/img/arepa rellena con pollo.jpeg' (length=33)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string 'Delicious Arepa ' (length=16)
1 =>
array
'id' => string '2' (length=1)
'dish_name' => string 'Arepa Con Queso' (length=15)
'dish_disc' => string 'Corn patie with Cheese' (length=22)
'dish_price' => string '2.65' (length=4)
'dish_image' => string '/img/arepa rellena con queso.jpeg' (length=33)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string '' (length=0)
2 =>
array
'id' => string '3' (length=1)
'dish_name' => string 'Empanadas de Carne' (length=18)
'dish_disc' => string 'Patties with beef' (length=17)
'dish_price' => string '1.60' (length=4)
'dish_image' => string '/img/empanadas de carne.jpeg' (length=28)
'dish_category_id' => string '1' (length=1)
'dish_price_label' => string '' (length=0)
3 =>
array
'id' => string '4' (length=1)
'dish_name' => string 'Empanadas de Pollo' (length=18)
'dish_disc' => string 'Patties with Chicken' (length=20)
'dish_price' => string '1.94' (length=4)
'dish_image' => string '/img/empanadas de pollo.jpeg' (length=28)
'dish_category_id' => string '1' (length=1)
There are more arrays besides these.. but they all have the same format.
These come from working with the following controllers
class DishCategory extends AppModel{
public $hasMany = array(
'Dish' => array(
'className' => 'Dish',
'foreignKey' => 'dish_category_id'
)
);
}
class DishCategoriesController extends AppController {
function get_categories($id)
{
// find category with a dish of $id
$this->set('dishes', $this->DishCategory->find('first', array(
'conditions' => array(
'DishCategory.id' => $id
)
)));
// set master layout
$this->layout = 'master_layout';
}
}
Use this->set('variableName', $data); to pass your arrays from the controller to the view.
You can then access the example above as $variableName in your view. I would recommend doing a <?php debug($variableName); ?> first to see what your array looks like in the view. It should be the same, but it will help you know what indices to use.
For more info: http://book.cakephp.org/view/979/set

Resources