I have the following array:
array (
'extension' =>
array (
'type' => 'string',
'format' => 'file-extension',
),
'filename' =>
array (
'type' => 'string',
'format' => 'filename',
),
'size' =>
array (
'type' => 'number',
),
'created' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'name' =>
array (
'type' => 'string',
'format' => 'string',
),
'modified' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'description' =>
array (
'type' => 'string',
'format' => 'string',
),
'type' =>
array (
'type' => 'string',
'format' => 'string',
),
'uuid' =>
array (
'type' => 'string',
'format' => 'uuid',
),
)
I am trying to use recursively loop through the array and take the value of 'type' from the sub array and make it the value of the parent. For example, end result:
array (
'extension' => 'string',
'filename' => 'string',
'size' => 'number',
'created' =>
array (
'date' => 'string'
'timezone' => 'string',
'timezone_type' => 'number'
),
I am able to produce a result that works on the first level of arrays, but cant get it to traverse into the nested arrays. My code is:
$fields = array (
'extension' =>
array (
'type' => 'string',
'format' => 'file-extension',
),
'filename' =>
array (
'type' => 'string',
'format' => 'filename',
),
'size' =>
array (
'type' => 'number',
),
'created' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'name' =>
array (
'type' => 'string',
'format' => 'string',
),
'modified' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'description' =>
array (
'type' => 'string',
'format' => 'string',
),
'type' =>
array (
'type' => 'string',
'format' => 'string',
),
'uuid' =>
array (
'type' => 'string',
'format' => 'uuid',
),
);
self::traverseArray($fields);
public static function traverseArray(&$fields) {
foreach ($fields as $field => $val) {
foreach ($val as $value) {
if (is_array($value)) {
foreach ($value as $_key => $_val) {
self::traverseArray($val);
}
} else {
$fields[$field] = $val['example'] ?? $val['format'] ?? $val['type'] ;
}
}
}
}
Which outputs:
array (
'extension' => 'file-extension',
'filename' => 'filename',
'size' => 'number',
'created' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
'example' => 'America/New_York',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'name' => 'string',
'modified' =>
array (
'date' =>
array (
'type' => 'string',
'format' => 'date-time',
),
'timezone' =>
array (
'type' => 'string',
'format' => 'string',
),
'timezone_type' =>
array (
'type' => 'number',
),
),
'description' => 'string',
'type' => 'string',
'uuid' => 'uuid',
)
You have too much looping going on in your function and are making things confusing. You need to start with a simple test to determine if the value is another array of fields, or your type/format/example array. It seems like testing if the type key exists would be the way to do this. If it is another array of values, do your recursive call, if not save the value. You do not need to have another foreach loop in your recursive call branch, that happens when the new function call takes place.
You also need to preserve the result of the recursive array in the original. It's easier to manage this if you just use a return value rather than mess with references.
$fields = convertArray($fields);
print_r($fields);
function convertArray($fields) {
foreach ($fields as $field => $val) {
if (array_key_exists('type', $val)) {
$fields[$field] = $val['example'] ?? $val['format'] ?? $val['type'] ;
} else {
$fields[$field] = convertArray($val);
}
}
return $fields;
}
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 am using jquery query builder , $rule is array
how to loop thround all inner arrays with their proper condition and returns the $rule is true or false?
$rule = array (
'condition' => 'AND',
'rules' => array (
0 => array (
'id' => 'name',
'field' => 'name',
'type' => 'string',
'input' => 'text',
'operator' => 'equal',
'value' => 'bibin',
),
1 => array (
'id' => 'category',
'field' => 'category',
'type' => 'integer',
'input' => 'select',
'operator' => 'not_equal',
'value' => 1,
),
2 => array (
'condition' => 'OR',
'rules' => array (
0 => array (
'id' => 'name',
'field' => 'name',
'type' => 'string',
'input' => 'text',
'operator' => 'equal',
'value' => 'john',
),
1 => array (
'id' => 'category',
'field' => 'category',
'type' => 'integer',
'input' => 'select',
'operator' => 'equal',
'value' => 2,
),
2 => array (
'condition' => 'OR',
'rules' => array (
0 => array (
'id' => 'name',
'field' => 'name',
'type' => 'string',
'input' => 'text',
'operator' => 'equal',
'value' => 'tech',
),
1 => array (
'id' => 'price',
'field' => 'price',
'type' => 'double',
'input' => 'number',
'operator' => 'greater_or_equal',
'value' => 500,
),
),
),
3 => array (
'condition' => 'AND',
'rules' => array (
0 => array (
'id' => 'name',
'field' => 'name',
'type' => 'string',
'input' => 'text',
'operator' => 'equal',
'value' => 'top',
),
1 => array (
'id' => 'category',
'field' => 'category',
'type' => 'integer',
'input' => 'select',
'operator' => 'equal',
'value' => 5,
),
),
),
),
),
3 => array (
'condition' => 'AND',
'rules' => array (
0 => array (
'id' => 'name',
'field' => 'name',
'type' => 'string',
'input' => 'text',
'operator' => 'equal',
'value' => 'vishnu',
),
1 => array (
'id' => 'price',
'field' => 'price',
'type' => 'double',
'input' => 'number',
'operator' => 'less_or_equal',
'value' => 1000,
),
),
),
)
);
I have a nested array called $rule.
I want to check the array returns true or false
Is any idea to check this array returns true or false?
How to iterarte and check with inner arrays?
You have a logical operator applying to some rules.
You might need a function that uses that operator on the differents rules.
I assume you build it that way
/*
* $operator being 'OR' / 'AND'
* $rules being an array
* returns true or false
*/
function ApplyCondition($operator, $rules)
{
// some code
}
I suggest you to build a function that will loop through the rules and check if the $rules array has a 'condition' key. Since your original array is a tree (you don't know how deep can be the nested arrays), you must use a recursive function to parse it.
/*
* $rules being an array
* At first call, you have no condition yet, hence its default value is null
* returns true or false
*/
function ParseRules($rules, $condition = null)
{
if (isset($rules['condition']) && isset($rules['rules']))
{
/*
* An array with some rules and a condition was found.
* Let's do a recursive call that will return true or false
*/
return (ParseRules($rules['rules'], $rules['condition']));
}
else
{
/*
* An array without a condition was found.
* Let's apply the upper function that will return true or false
* to the previous recursive call
*/
return (ApplyCondition($condition, $rules));
}
}
/*
* $operator being 'OR' / 'AND'
* $rules being an array
* returns true or false
*/
function ApplyCondition($operator, $rules)
{
foreach ($rules as $rule)
{
if (isset($rule['condition']) && isset($rule['rules']))
{
/*
* An array with some rules and a condition was found.
* Let's do a recursive call that will return true or false
*/
$SomeBooleanValueToHandle = ParseRules($rule['rules'], $rule['condition']);
}
else
{
// some code
}
}
return ($SomeBooleanValueToHandle);
}
U can use foreach loop to access every nested array:
echo "<pre>";
foreach ($rule as $r) {
var_dump($r);
}
If u want to access some property (key => value), u can do it with $r['id']; $r['field']; .. etc.
For an aggregation result i have a field (type_name2) in my mapping with a lowercased filter and a keyword tokenizer. But if I set this filter and tokenizer to the field my bucket is now empty. I have set this token and filter to ignoring spaces in words like: Fun X or Viva X.
Here my mapping (in PHP):
'cars' => array(
'properties' => array(
/**'type_name2' => array(
'type' => 'string',
'fields' => array(
'raw' => array(
'type' => 'string',
'analyzer' => 'keyword'
)
)
),**/
'type_name2' => array(
'type' => 'string',
'analyzer' => 'keyword_lower'
),
'type_kw' => array(
'type' => 'float'
),
'type_hp' => array(
'type' => 'float'
)
)
),
and the custom analyzer:
'analysis' => array(
'analyzer' => array(
'keyword_lower' => array(
'tokenizer' => 'keyword',
'filter' => 'lowercase'
),
'nGram_analyzer' => array(
'type' => 'custom',
'tokenizer' => 'whitespace',
'filter' => array(
'lowercase',
'asciifolding',
'nGram_filter'
)
),
'whitespace_analyzer' => array(
'type' => 'custom',
'tokenizer' => 'whitespace',
'filter' => array(
'lowercase',
'asciifolding'
)
)
),
'filter' => array(
'nGram_filter' => array(
'type' => 'ngram',
'min_gram' => 2,
'max_gram' => 20,
'token_chars' => array(
'letter',
'digit',
'punctation',
'symbol'
)
),
)
)
but the result of type_name2 is empty:
'type_name2' =>
array (size=1)
'buckets' =>
array (size=0)
empty
Any ideas, what is wrong?
Thx and regards
Stefan
Need some guidance with some PHP recursion, I'm looping through some data comparing it against a Map, and if a form (in the data) has a subform it needs to be added to the DB with the parents forms ID.
All seems to be working except a subform is an array as there can be multiple subforms of the same type.
Heres a brief structure:
Parent[0]
SF_1[0]
_SF_2[0]
_SF_2[1]
_SF_2[n]
SF_1[1]
SF_2[0]
SF_n[0]
So I add the parent in a separate function, then start the subform recursion (this bit works fine):
private function add_form_records($_data, $map)
{
$form = new FormItem();
foreach($map["fields"] as $item) {
$key = $item->field;
if(array_key_exists($key, $_data))
{
$form->column_data->$key = $_data[$key];
}
}
$form->list_name = $map["sp_list"];
$form->form_id = $this->id_count;
$form->__metadata->type = $this->get_list_id($form->list_name);
//Add the form to SP and get the ID back for the subforms
$id = $this->add_record($form);
foreach($map["subforms"] as $key=>$value) {
$this->add_subform_records($_data[$key], $value, $form->form_id);
}
}
Then heres the function that gets called to add the subforms and then call itself it the subform has subforms:
private function add_subform_records($_data, $_map, $_parent_id)
{
for ($i = 0; $i < count($_data); ++$i) {
$form = new FormItem();
foreach($_map["fields"] as $fieldItem)
{
$key = $fieldItem->field;
if(array_key_exists($key, $_data[$i]))
{
$form->column_data->$key = $_data[$i][$key];
}
}
$form->parent_id = $_parent_id;
$form->list_name = $_map["sp_list"];
$form->form_id = $this->id_count;
$form->form_name = $_map["subform_name"];
$form->__metadata->type = $this->get_list_id($form->list_name);
$id = $this->add_record($form);
if(array_key_exists('subforms', $_map))
{
foreach($_map["subforms"] as $key=>$value) {
foreach($_data as $subform)
{
if(array_key_exists($key, $subform))
{
$this->add_subform_records($subform[$key],$value, $form->form_id);
}
}
}
}
}
}
So the problem is it adds the first subform, goes to add its subforms (and does) but doesn't come back to the for ($i = 0; $i < count($_data); ++$i) to add the others.
Thanks!
$_data
array ( '_submit' => 'submit', '_submittedTime' => '1386837565194', '_submittedTimezoneOffset' => '11', 'ReportedBy' => 'test', 'DateAndTime' => '2013-12-12 19:38', 'Location' => 'hello', 'ClientName' => 'my', 'DiscussionType' => 'Meeting', 'SF_Attendees' => array ( 0 => array ( 'AttendeeName' => 'name', 'Company' => 'is', 'SF_Trip' => array ( 0 => array ( 'test1' => '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', '_action' => 'add', 'test1_mimetype' => 'image/jpeg', 'test2' => '', 'test3' => '', ), ), '_action' => 'add', ), 1 => array ( 'AttendeeName' => 'S', 'Company' => 'T', '_action' => 'add', ), ), 'ReasonforMeeting' => 'test', 'FollowUp' => '2013-12-19 19:38', 'UserEmail' => 'dev#dev.com', 'EmailCopyTo' => 's#s.com', 'SF_Attend' => array ( 0 => array ( 'AttendeeName' => 'test', 'Company' => 'test', '_action' => 'add', ), ), '_action' => 'add', '_uuid' => '63FD4677-C72A-4F1A-B711-963849B6840B', '_DateAndTime_time_offset' => '+11:00', '_FollowUp_time_offset' => '+11:00', )
$map
array ( 'sp_list' => 'ClientMeetingNote', 'fields' => array ( 0 => SchemaItem::__set_state(array( 'field' => 'ReportedBy', 'type' => 'textbox', )), 1 => SchemaItem::__set_state(array( 'field' => 'DateAndTime', 'type' => 'timestamp', )), 2 => SchemaItem::__set_state(array( 'field' => 'Location', 'type' => 'textbox', )), 3 => SchemaItem::__set_state(array( 'field' => 'ClientName', 'type' => 'textbox', )), 4 => SchemaItem::__set_state(array( 'field' => 'DiscussionType', 'type' => 'radio', )), 5 => SchemaItem::__set_state(array( 'field' => 'ReasonforMeeting', 'type' => 'text_area', )), 6 => SchemaItem::__set_state(array( 'field' => 'FollowUp', 'type' => 'timestamp', )), 7 => SchemaItem::__set_state(array( 'field' => 'Signature', 'type' => 'sketch_signature', )), 8 => SchemaItem::__set_state(array( 'field' => 'UserEmail', 'type' => 'email', )), 9 => SchemaItem::__set_state(array( 'field' => 'EmailCopyTo', 'type' => 'email', )), ), 'subforms' => array ( 'SF_Attendees' => array ( 'subform_name' => 'SF_Attendees', 'subform_data_name' => 'SF_Attendees', 'sp_list' => 'Attendees', 'fields' => array ( 0 => SchemaItem::__set_state(array( 'field' => 'AttendeeName', 'type' => 'textbox', )), 1 => SchemaItem::__set_state(array( 'field' => 'Company', 'type' => 'textbox', )), ), 'subforms' => array ( 'SF_Trip' => array ( 'subform_name' => 'SF_Trip', 'subform_data_name' => 'SF_Trip', 'sp_list' => 'Trip', 'fields' => array ( 0 => SchemaItem::__set_state(array( 'field' => 'test1', 'type' => 'camera', )), 1 => SchemaItem::__set_state(array( 'field' => 'test2', 'type' => 'image_library', )), 2 => SchemaItem::__set_state(array( 'field' => 'test3', 'type' => 'file_upload', )), ), ), ), ), 'SF_Attend' => array ( 'subform_name' => 'SF_Attend', 'subform_data_name' => 'SF_Attendees', 'sp_list' => 'Attendees', 'fields' => array ( 0 => SchemaItem::__set_state(array( 'field' => 'AttendeeName', 'type' => 'textbox', )), 1 => SchemaItem::__set_state(array( 'field' => 'Company', 'type' => 'textbox', )), ), 'subforms' => array ( 'SF_Trip' => array ( 'subform_name' => 'SF_Trip', 'subform_data_name' => 'SF_Trip', 'sp_list' => 'Trip', 'fields' => array ( 0 => SchemaItem::__set_state(array( 'field' => 'test1', 'type' => 'camera', )), 1 => SchemaItem::__set_state(array( 'field' => 'test2', 'type' => 'image_library', )), 2 => SchemaItem::__set_state(array( 'field' => 'test3', 'type' => 'file_upload', )), ), ), ), ), ), )
Figured it out!! Had to restructure code as it was looping through the data twice, recursion was working fine I was sending it the wrong data.
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!