Related
I get passed an array in a callback function. Now I want access a value of this array.
I can dump this array into a file with var_export($fields[1], True)
Here is the content of the export:
helper_plugin_bureaucracy_fieldtextbox::__set_state(array(
'mandatory_args' => 2,
'opt' =>
array (
'cmd' => 'textbox',
'label' => 'Kunde',
'display' => 'Kunde',
'value' => 'myimportantdata',
),
'tpl' =>
array (
'_elem' => 'textfield',
'_text' => '##DISPLAY##',
'_class' => '##CLASS##',
'id' => '##ID##',
'name' => '##NAME##',
'value' => '##VALUE##',
'class' => 'edit required',
'required' => 'required',
),
'checks' =>
array (
),
'hidden' => false,
'error' => false,
'checktypes' =>
array (
'/' => 'match',
'<' => 'max',
'>' => 'min',
),
))
I want to access the value of opt->value whitch is 'myimportantdata' in this case.
How can I achieve this?
I already tried:
$mydata = $fields[1]['helper_plugin_bureaucracy_fieldtextbox']['opt'];
$mydata = $fields[1][0][2];
$mydata = $fields[1]->helper_plugin_bureaucracy_fieldtextbox['opt'];
without success :-(
fields[1] contains an object of the type 'helper_plugin_bureaucracy_fieldtextbox'. The access to the properties of the object such as 'opt' must be done with the -> operator.
$opt = $fields[1]->opt;
$opt_value = $fields[1]->opt['value']; //myimportantdata
$data = array(
'mandatory_args' => 2,
'opt' =>
array (
'cmd' => 'textbox',
'label' => 'Kunde',
'display' => 'Kunde',
'value' => 'myimportantdata',
),
'tpl' =>
array (
'_elem' => 'textfield',
'_text' => '##DISPLAY##',
'_class' => '##CLASS##',
'id' => '##ID##',
'name' => '##NAME##',
'value' => '##VALUE##',
'class' => 'edit required',
'required' => 'required',
),
'checks' =>
array (
),
'hidden' => false,
'error' => false,
'checktypes' =>
array (
'/' => 'match',
'<' => 'max',
'>' => 'min',
),
);
echo $data["opt"]["value"];
I would like to replace keys in arrays, because I will move them on two indexes up.
Problem that I am facing is that those are containing same names which will not be ok, if i want to move them up.
This is how array looks like.
$list = array(
'ind' => array(
'messagetype' => 'Alert',
'visibility' => 'Public',
'info' => array(
0 => array(
'urgency' => 'Urgent',
'params' => array(
0 => array(
'Name' => 'display',
'value' => '3; top',
),
1 => array(
'Name' => 'level',
'value' => '1; blue',
),
),
'area' => array(
'ard' => 'Bob',
'code' => array(
0 => array(
'Name' => 'Badge',
'value' => 'GSSD154',
),
),
),
),
1 => array(
'messagetype' => 'Information',
'visibility' => 'Private',
'info' => array(
0 => array(
'urgency' => 'Minor',
'params' => array(
0 => array(
'Name' => 'display',
'value' => '1; left',
),
1 => array(
'Name' => 'level',
'value' => '1; red',
),
),
'area' => array(
'ard' => 'Bob',
'code' => array(
0 => array(
'Name' => 'Badge',
'value' => 'GBECS23',
),
),
),
),
),
),
),
),
);
and this is how I would like the output to be with changing keys in Name0, Name1, which are inside params.
$list = array(
'ind' => array(
'messagetype' => 'Alert',
'visibility' => 'Public',
'info' => array(
0 => array(
'urgency' => 'Urgent',
'params' => array(
0 => array(
'Name0' => 'display',
'value0' => '3; top',
),
1 => array(
'Name1' => 'level',
'value1' => '1; blue',
),
),
'area' => array(
'ard' => 'Bob',
'code' => array(
0 => array(
'Name' => 'Badge',
'value' => 'GSSD154',
),
),
),
),
1 => array(
'messagetype' => 'Information',
'visibility' => 'Private',
'info' => array(
0 => array(
'urgency' => 'Minor',
'params' => array(
0 => array(
'Name0' => 'display',
'value0' => '1; left',
),
1 => array(
'Name1' => 'level',
'value1' => '1; red',
),
),
'area' => array(
'ard' => 'Bob',
'code' => array(
0 => array(
'Name' => 'Badge',
'value' => 'GBECS23',
),
),
),
),
),
),
),
),
);
I have tried with a lots of examples over this website, but could not find one to achieve this.
Code that I used from
How to replace key in multidimensional array and maintain order
function replaceKey($subject, $newKey, $oldKey) {
// if the value is not an array, then you have reached the deepest
// point of the branch, so return the value
if (!is_array($subject)) {
return $subject;
}
$newArray = array(); // empty array to hold copy of subject
foreach ($subject as $key => $value) {
// replace the key with the new key only if it is the old key
$key = ($key === $oldKey) ? $newKey : $key;
// add the value with the recursive call
$newArray[$key] = replaceKey($value, $newKey, $oldKey);
}
return $newArray;
}
$s = replaceKey($list, 'Name0', 'Name');
print "<PRE>";
print_r($s);
at the moment I get this output:
[0] => Array
(
[Name0] => display
[value] => 1; left
)
[1] => Array
(
[Name0] => level
[value] => 1; red
)
any help would be appreciated. regards
A very strange question, but why not?
The following function returns nothing (a procedure) and changes the array in-place using references but feel free to rewrite it as a "real" function (without references and with a return statement somewhere).
The idea consists to search for arrays, with numeric keys and at least 2 items, in which each item has the Name and value keys. In other words, this approach doesn't care about paths where the targets are supposed to be:
function replaceKeys(&$arr) {
foreach ($arr as &$v) {
if ( !is_array($v) )
continue;
$keys = array_keys($v);
if ( count($keys) < 2 ||
$keys !== array_flip($keys) ||
array_keys(array_merge(...$v)) !== ['Name', 'value'] ) {
replaceKeys($v);
continue;
}
foreach ($v as $k => &$item) {
$item = array_combine(["Name$k", "value$k"], $item);
}
}
}
replaceKeys($list);
print_r($list);
demo
I have a serialized field in my database. I can get the contents of this field and unserialize them however I am unsure how to get certain values of these. I ultimately need a foreach of each item and value from the data.
In the below example I need to be able to get the following:
Main Image Replacement:
BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-14.JPG Complimentary:
Comp Text Quote Code: Code Text
I need the label as one variable and the value as another within a foreach. These labels and values are variable so I cannot manually get this data by their labels.
array (
0 =>
array (
'mode' => 'builder',
'cssclass' => '',
'hidelabelinorder' => '',
'hidevalueinorder' => '',
'element' =>
array (
'type' => 'radio',
'rules_type' =>
array (
'Reprint_0' =>
array (
0 => '',
),
'Edit Artwork_1' =>
array (
0 => '',
),
),
'_' =>
array (
'price_type' => '',
),
),
'name' => '',
'value' => 'Edit Artwork',
'price' => '',
'section' => '58073632e582b5.35893028',
'section_label' => '',
'percentcurrenttotal' => 0,
'currencies' =>
array (
),
'price_per_currency' =>
array (
'GBP' => '',
),
'quantity' => 1,
'multiple' => '1',
'key' => 'Edit Artwork_1',
'use_images' => '',
'changes_product_image' => '',
'imagesp' => '',
'images' => '',
),
1 =>
array (
'mode' => 'builder',
'cssclass' => '',
'hidelabelinorder' => '',
'hidevalueinorder' => '',
'element' =>
array (
'type' => 'radio',
'rules_type' =>
array (
'BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-14.JPG_0' =>
array (
0 => '',
),
'BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-21.JPG_1' =>
array (
0 => '',
),
'BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-77.JPG_2' =>
array (
0 => '',
),
),
'_' =>
array (
'price_type' => '',
),
),
'name' => 'Main Image Replacement',
'value' => 'BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-14.JPG',
'price' => '',
'section' => '58073632e582d2.46631826',
'section_label' => 'Main Image Replacement',
'percentcurrenttotal' => 0,
'currencies' =>
array (
),
'price_per_currency' =>
array (
'GBP' => '',
),
'quantity' => 1,
'multiple' => '1',
'key' => 'BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-14.JPG_0',
'use_images' => 'images',
'changes_product_image' => '',
'imagesp' => '',
'images' => 'http://burhill.immaculate.co.uk/wp-content/uploads/2016/10/BGL_Burhill_People_AndyHiseman_300dpi_Super-Size-14-150x150.jpg',
),
2 =>
array (
'mode' => 'builder',
'cssclass' => 'col-6',
'hidelabelinorder' => '',
'hidevalueinorder' => '',
'element' =>
array (
'type' => 'textfield',
'rules_type' =>
array (
0 =>
array (
0 => '',
),
),
'_' =>
array (
'price_type' => '',
),
),
'name' => 'Complimentary',
'value' => 'Comp Text',
'price' => '',
'section' => '58073632e582f4.32183997',
'section_label' => 'Complimentary',
'percentcurrenttotal' => 0,
'currencies' =>
array (
),
'price_per_currency' =>
array (
),
'quantity' => 1,
),
3 =>
array (
'mode' => 'builder',
'cssclass' => 'col-6',
'hidelabelinorder' => '',
'hidevalueinorder' => '',
'element' =>
array (
'type' => 'textfield',
'rules_type' =>
array (
0 =>
array (
0 => '',
),
),
'_' =>
array (
'price_type' => '',
),
),
'name' => 'Quote Code',
'value' => 'Code Text',
'price' => '',
'section' => '58073632e58317.46363272',
'section_label' => 'Quote Code',
'percentcurrenttotal' => 0,
'currencies' =>
array (
),
'price_per_currency' =>
array (
),
'quantity' => 1,
),
)
foreach($your_array as $key => $value) {
$your_value = $value['value'];
$your_label = $value['section_label'];
}
This should work for you as long as i got the right keys there.
i want to multidimensional array to my view and then use this array to build form
This is what i've in my controller
function signin(){
$attributes = array(
'name' =>
array(
'name' => 'name',
'type' => 'text',
'placeholder' => '' ,
'value' => 'value'
),
'password' =>
array(
'name' => 'name',
'type' => 'password',
'placeholder' => '',
),
'gender' =>
array(
'name' => 'name',
'type' => 'select',
'value'=>
array(
'male','female'
),
),
'usertpye'=>array(
'type' => 'radio',
'seller' => 'seller',
'buyer' => 'buyer'
),
'upload'=>array(
'type' => 'file',
'name' => 'file'
),
'submit'=>array(
'type' => 'submit',
'name' => 'submit',
'value' => 'submit'
)
);
$this->load->view('login',$attributes);
}
in my view login i can access these items like $name or $password but i want to fetch in a loop.really have no idea how can i do it please help.
The load function receives an array, which keys then parses as variables in the view. Thus, you get variables like $name, $password etc.
Just add another layer before calling the load function like:
$data['attributes'] = $attributes;
And then, when loading the view do
$this->load->view('login',$data);
Here is the array a bit adjusted:
$attributes = array(
'name' =>
array(
'name' => 'name',
'type' => 'text',
'placeholder' => '' ,
'value' => 'value'
),
'password' =>
array(
'name' => 'name',
'type' => 'password',
'placeholder' => '',
),
'gender' =>
array(
'name' => 'name',
'type' => 'select',
'options' => array(
'male' => 'Male',
'female' => 'Female'
),
),
'usertpye'=>array(
'type' => 'radio',
'values' => array(
'seller' => 'seller',
'buyer' => 'buyer'
)
),
'upload'=>array(
'type' => 'file',
'name' => 'file'
),
'submit'=>array(
'type' => 'submit',
'name' => 'submit',
'value' => 'submit'
)
);
Here is how it would look like with the form helper of CI (this would go in the view, remember to first load the helper in the controller):
echo form_open('email/send');
foreach($attributes as $key=>$attribute) {
echo form_label($key).'<br/>';
if($attribute['type'] == 'select') {
echo form_dropdown($attribute['name'],$attribute['options']).'<br/>';
} elseif($attribute['type'] == 'radio') {
foreach ($attribute['values'] as $value) {
echo form_label($value);
echo form_radio(array('name' => $key, 'value' => $value)).'<br/>';
}
} else {
echo form_input($attribute).'<br/>';
}
}
Note I did some adjustments to your initial attributes array to make it work, but you'd still need to improve its structure, add unique names for all items etc.
I'm trying to turn a huge configuration array in PHP, that looks like this
$config['festival'] =
array
(
'title' => 'USF Tango Festival',
'tableLayout' => array
(
'registration' => array
(
array('firstName','text'),
array('lastName','text'),
array('phone','text'),
array('email','text'),
array('hearAboutFestival','text'),
array('danceAs','enum(\'Leader\', \'Follower\', \'Both\')'),
array('student','tinyint(1)')
),
'experience' => array
(
array('options','text'),
array('lunchMeat','enum(\'Ham\',\'Turkey\',\'Vegetarian\')'),
array('lunchBread','enum(\'White\',\'Wheat\')'),
array('dinnerPref','enum(\'Chicken\',\'Beef\',\'Vegetarian\')')
)
),
'pageLayout' => array
(
'registration' => array
(
'jqueryRules' =>
<<<EOT
'firstName': 'required',
'lastName': 'required',
'phone': {
required: true,
phoneUS: true
},
'email': {
required: true,
email: true
},
'danceAs': 'required',
'partner': 'required',
'partnerMatching': {
required: function() {
return $("input[name='partner']").val() == 0;
}
},
'partnerName': {
required: function() {
return $("input[name='partner']").val() == 1;
}
}
EOT
,
'inputs' => array
(
array
(
'type' => 'text',
'name' => 'firstName',
'fullName' => 'First Name',
'required' => true,
'separateDiv' => false
),
array
(
'type' => 'text',
'name' => 'lastName',
'fullName' => 'Last Name',
'required' => true,
'separateDiv' => false
),
array
(
'type' => 'text',
'name' => 'phone',
'fullName' => 'Phone number',
'required' => true,
'separateDiv' => false
),
array
(
'type' => 'text',
'name' => 'email',
'fullName' => 'Email address',
'required' => true,
'separateDiv' => false
),
array
(
'type' => 'text',
'name' => 'hearAboutFestival',
'separateDiv' => false,
'fullName' => 'How did you hear about the festival?',
'required' => false
),
array
(
'type' => 'select',
'name' => 'danceAs',
'fullName' => 'You dance as a...',
'required' => true,
'separateDiv' => false,
'options' => array(array('leader','Leader'),array('follower','Follower'),array('both','Both'))
),
array
(
'type' => 'checkbox',
'name' => 'student',
'value' => '1',
'separateDiv' => false,
'fullName' => 'I am a student',
'required' => false
)
)
)
and
'options' => array
(
'busMilonga' => array
(
'price' => 20,
'student' => false,
'name' => 'Tango on the Town Bus milonga',
'description' => 'A bus milonga!'
),
'thursdayMilonga' => array
(
'price' => 10,
'student' => false,
'name' => 'Thursday Kickoff Milonga',
'description' => 'The un-official kick off milonga!'
),
'saturdayPass' => array
(
'price' => 90,
'student' => true,
'name' => 'Saturday pass',
'description' => 'Includes all Saturday workshops and milongas'
),
'sundayPass' => array
(
'price' => 80,
'student' => true,
'name' => 'Sunday pass',
'description' => 'Includes all Sunday workshops, the jam session, and milonga'
),
'milongaPass' => array
(
'price' => 70,
'earlyBird' => 50, //array(50,60),
'student' => true,
'name' => 'Milonga Pass',
'description' => 'Includes entrance to all night milongas'
),
'dinnerPass' => array
(
'price' => 20,
'student' => false,
'name' => 'Dinner pass',
'description' => 'Includes Saturday dinner'
),
'lunchPass' => array
(
'price' => 10,
'student' => false,
'name' => 'Saturday lunch',
'description' => 'Includes lunch on Saturday'
)
),
'info' => array
(
'instructors' => array('Instructors'),
'hour' => array('10','11','12','01','02','03'),
'min' => array('15','30','45','00'),
'tod' => array('AM','PM'),
'day' => array('Friday','Saturday','Sunday'),
'level' => array('Beginner','Intermediate','Advanced'),
'place' => array('REC 107','REC 033','REC 005'),
'sessions' => array
(
3, // days
array
(
'Friday', // day name
3, // sessions on this day
array
(
3, // workshops in session
'1100AM' // time
),
array
(
3,
'0100PM'
),
array
(
1,
'0230PM'
) // 1,4
),
array('Saturday', // 2,0
3, // 2,1
array(1,'1030AM'), //2,2
array(3,'1145AM'), // 2,3
array(3,'0145PM') // 2,4
),
array
(
'Sunday', // 3,0
3, // 3,1
array(1,'1115AM'), // 3,2
array(3,'1230PM'), // 3,3
array(3,'0230PM') // 3,4
)
)
)
into a database. I'm thinking I could make a few tables, titled something like config.event.festival but then it would get cumbersome since I would have to create a table for each array under the array...
I want to avoid using JSON encoding or serializing, so that I keep the data all relational and clean looking but I don't know any other way other than just keeping one big configuration file rather than a database.
Assuming the sample you provided represents a truncated view of your whole data structure, this could be done with three tables.
festival
festival_id
title
layout
layout_id
festival_id
layout_type_id
type
name
fullName
required
separateDiv
layout_type
layout_type_id
name
The festival table would keep your high-level meta data about the event page. The layout table would contain meta data about each of the elements on the page. And finally, the layout_type table would allow you to identify different element types that should be on a given page.
This should get you started and allow you to modify as necessary.
Try this:
// To save multidimensional array into database:
$confIn = serialize($config);
// Save serialized config into database
// To get it from database, query the database and get serialized value
$confOut = serialize($confIn);
// Check if its ok
var_export($confOut);
More about serialize function: Serialize
The good thing with this approach is you can use only one column in database.
Hope this helps!