Get array value by dynamic key in php - php

maybe I am totally blind but i have an array:
Array ( [p541] => 1 [p747] => 1 [p792] => 1 [p968] => 1 [p2157] => 1 [clickeditem] => 0WCr9ParDzLD9wpctknt0XErhOZcX33wXfgGDNpSoIo= [actualtime] => 11832 [timekey] => 1406227645 [actualuser_id] => V58yD4MQ2ZwTumjivhhQL/BSFXsu0Dvoj0bxp7Tu8PM= [timeout] => 0 [report_misuse] => 0 [A1] => 5RC52CZHPV8f0Zw+FYGZel5Ay2YcLVjrY8MBplz1zJA= [B1] => 0WCr9ParDzLD9wpctknt0XErhOZcX33wXfgGDNpSoIo= [B2] => KnCK/vIcQ5PAwJxjUMh0w+NTM+TqdVG9+Tiyi0U9QWM= [B3] => DhT8qBQFQC+dE/Rku7wdMJ4bw6dtFp8hzfmxPMCrItQ= [B4] => ZE30ASB6IUQglpXNiOUxdmiYpJnEbuKKXIaUZO9w4mU= [B5] => IXyGTO6V/8uZOK5y81DnI58xumZ0CIkFsTQwUWJ2CyE= [pageloadtime] => 0.179646 [option] => com_findme [view] => pair )
but I want to get the value for "p541"
$name= "p541";
$value = $array [$name];
does not work ???

If your array variable is named $array, try this:
$value = $array['p541'];
What you're doing is creating a new array named $value containing the variable $name, which is not what we want.

Your array items need to be comma separated and not within [ ] if you're declaring associative arrays like that. You also need to save your array to a variable so you can access it.
$value = array('p541' => 1, 'p747' => 2, 'p792' => 3);
then this...
$value['p541']
will equal 1

Related

associative array mapping

Dunno if it is the right title or not, but i'm struggling to do the following thing:
say I have this array
Array
(
[0] => Array
(
[id_ptp] => 1
[denumire_ptp] => Hrană uscată
)
[1] => Array
(
[id_ptp] => 2
[denumire_ptp] => Hrană umedă
)
[2] => Array
(
[id_ptp] => 3
[denumire_ptp] => Hrană vie
)
)
how can I make it to become like this:
[
'1' => 'Hrană uscată',
'2' => 'Hrană umedă',
'3' => 'Hrană vie',
]
Better question, is there a function that does that? Because I was not able to find it.
array_column it is. Here is the one liner.
$result = array_column($your_array, 'denumire_ptp', 'id_ptp');
result : https://3v4l.org/qU0EU

PHP search JSON without looping

I have a large JSON array which is the result of querying the API of an Icinga2 monitoring system.
I have used json_decode like this in my code to decode it:
$response = json_decode($array, true);
and I can see the output looks like this:
Array
(
[results] => Array
(
[0] => Array
(
[attrs] => Array
(
[__name] => HOSTNAME0
[acknowledgement] => 0
[acknowledgement_expiry] => 0
...
...
[state] => 0
[state_type] => 1
[meta] => Array
(
)
[name] => HOSTNAME0
[type] => Host
)
[1] => Array
(
[attrs] => Array
(
[__name] => HOSTNAME1
[acknowledgement] => 0
[acknowledgement_expiry] => 0
...
...
[state] => 0
[state_type] => 1
[meta] => Array
(
)
[name] => HOSTNAME1
[type] => Host
)
There are 400 Records in total and it's quite a complex structure but the only bits I am really interested in are the name and state fields.
Basically my script has a list of 150 hostnames from another source and what I want to do is for each hostname, search for it in the array and return the value of the state field for that host.
So far I've been struggling to do this without looping through the entire array for each of the 150 hostnames. There must be a more efficient way to do a lookup in the array based on a hostname and return a single value but I can't figure it out.
Given, the name field has no logical sorting inside the json result, there is no way to look at least once at each element. If they are sorted alphabetical, you could use a simple binary search, which would give you the result in O(log(n)).
The other thing is, if you have to search for multiple names, you could put them inside an name assiciated array. This way, you only have an initial overhead of O(n) building the list and each following search would return you the state on O(1).
// building the array
$states = [];
foreach ($items as $item) {
$states[$item['name']] = $item['state'];
}
looking for HOSTNAME1
$state = $states['HOSTNAME1'];
I'm hoping that I've got the source data array in the correct layout as the format was a bit confusing from the original question. But the main idea is to use array_column to extract the "attrs" and key the result by the "name" element of this array.
$response = Array(
"results" => Array(
0 => Array(
"attrs" => Array(
"__name" => "HOSTNAME0",
"acknowledgement" => 0,
"acknowledgement_expiry" => 0,
"state" => 0,
"state_type" => 1
),
"name" => "HOSTNAME0",
"type" => "Host"
),
1 => Array(
"attrs" => Array(
"__name" => "HOSTNAME1",
"acknowledgement" => 0,
"acknowledgement_expiry" => 0,
"state" => 2,
"state_type" => 1
),
"name" => "HOSTNAME1",
"type" => "Host1"
)
)
);
$extract = array_column($response["results"], "attrs", "name");
print_r($extract);
With the sample data, this gives...
Array
(
[HOSTNAME0] => Array
(
[__name] => HOSTNAME0
[acknowledgement] => 0
[acknowledgement_expiry] => 0
[state] => 0
[state_type] => 1
)
[HOSTNAME1] => Array
(
[__name] => HOSTNAME1
[acknowledgement] => 0
[acknowledgement_expiry] => 0
[state] => 2
[state_type] => 1
)
)
So to find any server by name, you'd use
echo "HOSTNAME1=".$extract["HOSTNAME1"]["state"].PHP_EOL;
If you only wanted the state field (as you asked for) and wanted to simplify the array, you can then use...
array_walk($extract, function(&$data) {$data=$data["state"];});
print_r($extract);
The array_walk() goes through the array and just copies the state field to be the entry, so the result of this is...
Array
(
[HOSTNAME0] => 0
[HOSTNAME1] => 2
)
So now you just do...
echo "HOSTNAME1=".$extract["HOSTNAME1"].PHP_EOL;

PHP get key value pairs out from an array within a new array (array filtering, array reducing)

I am having an associative array like this:
[1] => Array
(
[logo] =>
[starting] =>
[prelim_info] =>
[state_entry] => 1
[district_entry] => 3
[CLIx_code] => 1009
[survey_time] => 2017-05-29 09:38:00.0
[Implement_module] =>
[CLIxModule_Impl] => 1
[Noimplement_reason] =>
[Other_Reason] =>
[implementedModule_Name] => 7 10 11 12
[Lab_Open] => 3
[Lab_Management] => 1
[Planned_CLIxPeriods] => 2
[ReasonsCancellation_CLIxClass] => 5
[PowerCut_Visit] => 2
[Observe_session:Session_observe] => 2
[Observe_session:grade_observe] =>
[Observe_session:grade_other] =>
[Observe_session:Module_Observed] =>
[Observe_session:Unit_Observed] =>
[Observe_session:Lesson_Observed] =>
[Observe_session:time_Sufficient] =>
[Observe_session:Student_workindependent] =>
[Observe_session:groupsinteracting] =>
[Observe_session:groupshelping] =>
[Observe_session:Students_Mothertongue] =>
[Observe_session:Students_handbook] =>
[Observe_session:Students_reflections] =>
[Observe_session:teacherpresent] =>
[Observe_session:encourage_platform] =>
[Observe_session:encourage_classdisc] =>
[Observe_session:mothertongue_teacher] =>
[Observe_session:teacher_handbook] =>
[Observe_session:Teacher_prepared] =>
[TPDcertification_support1:TPD_Cert_Subject1] =>
[TPDcertification_support1:tchrSupport_TPD1] =>
[TPDcertification_support1:Source_Support] =>
[TPDcertification_support2:TPD_Cert_Subject2] =>
[TPDcertification_support2:tchrSupport_TPD2] =>
[TPDcertification_support2:Source_Support] =>
[TPDcertification_support3:TPD_Cert_Subject] =>
[TPDcertification_support3:tchrSupport_TPD3] =>
[TPDcertification_support3:Source_Support] =>
[TPDcertification_support4:TPD_Cert_Subject] =>
[TPDcertification_support4:tchrSupport_TPD4] =>
[TPDcertification_support4:Source_Support] =>
[teacher_feedback] => Regarding the old modules, maths teachers said that it was very useful as well as workbook.
[FSP_feedback] => NA
[TPDsuppport_certification:Supt_TPDcertification] => 1
[TPDsuppport_certification:Source_Supportcertification] => 4
[teacherSupport_moduleImplement] => They had training organised by the clix team and RMSA.
[HighPoint] => NA
[LowPoint] => There was no clix class since school reopen.
[schlcontact_FSP_nooftimes] => 0
[FT_contactreason] => 5
[FT_otherreason] =>
[Support_fromTE] => 2
[Action_FT] => 1
[Specific_ActionFT] => School lab need to recheck for start rolling out the modules.
[Action_CLIxTeam] => 2
[Sepecific_ActionCLIx] =>
[Action_State] => 1
[Specific_ActionState] => To issue the class period include in their regular time table.
[Action_TPD] => 2
[Specific_ActionTPD] =>
[Session_observe2:Module_Second] =>
[Session_observe2:Observe_grade] =>
[Session_observe2:other_grade] =>
[Session_observe2:Observation_Module2] =>
[Session_observe2:Observation_Unit2] =>
[Session_observe2:Observation_Lesson2] =>
[Session_observe2:time_Sufficient2] =>
[Session_observe2:Student_workindependent2] =>
[Session_observe2:groupsinteracting2] =>
[Session_observe2:groupshelping2] =>
[Session_observe2:Students_Mothertongue2] =>
[Session_observe2:Students_handbook2] =>
[Session_observe2:Students_reflections2] =>
[Session_observe2:teacherpresent2] =>
[Session_observe2:encourage_platform2] =>
[Session_observe2:encourage_classdisc2] =>
[Session_observe2:mothertongue_teacher2] =>
[Session_observe2:teacher_handbook2] =>
[Session_observe2:Teacher_prepared2] =>
[teacher_feedback2] =>
[FSP_feedback2] =>
[TPD_certification:tcher_TPD] =>
[TPD_certification:certification_course_tchr_suport] =>
[teachersupport_moduleImplement2] =>
[school_location:Latitude] => 23.7428370300
[school_location:Longitude] => 92.7227306900
[school_location:Altitude] => 1014.0000000000
[school_location:Accuracy] => 18.0000000000
[generated_note_name_110] =>
[meta:instanceID] => uuid:2568400e-0ec3-421d-94bc-10653732e6d2
)
I want some key-value pairs from this array for data analysis and visualization. the output should look something like this:-
array(
[CLIx_code] => 1009
[state_entry] => 1
[district_entry] => 3
...
)
Basically, I want an array with a few key value pairs filtered on which I can operate some mathematical functions and pass those to D3.js for data visualization.
I tried it this way:
for ($i=0;$i<count($all_rows);$i++){
$filteredarray[] = array($all_rows[$i]['CLIx_code'], $all_rows[$i]['state_entry'], $all_rows[$i]['district_entry']);
}`
But I want key value pairs not only the value I even tried using array_filter().
I have to assume you know the key names for the elements that you want to retain and run calculations on, so array_intersect_key() is the right tool for the job.
Code (Demo):
$array=[
'logo'=>'',
'starting'=>'',
'prelim_info'=>'',
'state_entry'=>1,
'district_entry'=>3,
'CLIx_code'=>1009
// ... more elements
];
$filterkeys=[
'state_entry',
'district_entry',
'CLIx_code'
// ... more key names
];
var_export(array_intersect_key($array,array_flip($filterkeys)));
Output:
array (
'state_entry' => 1,
'district_entry' => 3,
'CLIx_code' => 1009,
)
Alternatively, you can drop the array_flip() call if you set your $filterkeys key names as keys, like this:
$filterkeys=[
'state_entry'=>'',
'district_entry'=>'',
'CLIx_code'=>''
// ... more key names
];
var_export(array_intersect_key($array,$filterkeys));
PHP: How to use array_filter() to filter array keys?
Just refer this Question's answer
Like in your case you need to write some code like below:-
<?php
//You have below array including all keys
$result_array = array('logo'=>'test','state_id'=>125,'prelim_info'=>'','CLIxModule_Impl'=>'5','district_entry'=>3);
// Now provide only those keys which you need to filter.
$filter_keys = array('district_entry','state_id');
$filtered_array = array_filter($result_array,
function ($key) use ($filter_keys) {
return in_array($key, $filter_keys);
},
ARRAY_FILTER_USE_KEY
);
var_dump($filtered_array);
?>

How to make array from a single quoted array

I have no idea How to convert a single quote array into array;
FOR Example:-
I have
$Array = '["ID" => 9, "Value" => [40,15,20,25,30]]';
print_r($Array);
Then it is showing like string not an array
["ID" => 9, "Value" => [40,15,20,25,30]]
so how to convert this into array
like the result will show like this
Array
(
[ID] => 9
[Value] => Array
(
[0] => 40
[1] => 15
[2] => 20
[3] => 25
[4] => 30
)
)
May be you have why i am putting array in single quote but this is not i am putting.
I Getting an array from DB after group_concat in mysql
This is the array
Array
(
[0] => Array
(
[GPN] => A
[PKGID] => PKG01
[Output] => ["ID" => 9, "Value" => [40,15,20,25,30]]
)
)
Here the Output is element coming like it's a string
You can do this but it might be dangerous:
$Array = '["ID" => 9, "Value" => [40,15,20,25,30]]';
eval('$Array = '.$Array.';'); // Could be dangerous
echo '<pre>';
print_r($Array);
echo '</pre>';
In my example above, $Array is assumed to be data coming from your database such as [Output] => ["ID" => 9, "Value" => [40,15,20,25,30]]. Since it is coming from the database then that means the possibility exists for the DB data to be malicious and eval() will gladly run anything you give it.
You can use eval to parse the string as php code like this:
$s = '["ID" => 9, "Value" => [40,15,20,25,30]]';
eval('$a = ' . $s . ';');
print_r($a);
This will work only with php 5.4 and up
CAUTION
If this string contains data from user then it is not safe to use eval.
Alternative solution
If you are the one who populate the database records, i suggests to serialize Output values as json, using json_encode, before insert to database.
Then you can use json_decode to access data as array.
<?php
$str = '["ID" => 9, "Value" => [40,15,20,25,30]]';
$array = eval('return ' . $str . ';');
var_export($array);
Output:
array (
'ID' => 9,
'Value' =>
array (
0 => 40,
1 => 15,
2 => 20,
3 => 25,
4 => 30,
),
)
So, your question is basically how to convert string representation of php array to php array. I don't know any tools for this, however you can use eval function.
$arr = [];
eval('$arr=' . $Array . ';');
// $arr contains php array
However this is not recommendable, because you can execute arbitrary code which undermines security of your application. Before using it you should make sure that $Array does not contain any malicious code and all strings are escaped.
If you run your application as a root user then it is even more dangerous. For example:
$Array = 'true?print_r($_SERVER['REQUEST_TIME']):0'
The above code will print all the server data of your application.
I think this solution.
$array = [
"ID" => 9,
"Value" => [40,15,20,25,30],
];
print_r($array);
Output :
/* Array ( [ID] => 9 [Value] => Array ( [0] => 40 [1] => 15 [2] => 20
[3]=> 25 [4] => 30 ) ) */
for other array :
$array =[
"0" => [
"GPN" => A,
"PKGID" => PKG01,
"Output" =>
[
"ID" => 9,
"Value" => [40,15,20,25,30]
]
]
];
print_r($array);
And output :
/*Array ( [0] => Array ( [GPN] => A [PKGID] => PKG01 [Output] => Array ( [ID] => 9 [Value] => Array ( [0] => 40 [1] => 15 [2] => 20 [3] => 25 [4] => 30 ) ) ) ) */
advise : the name "PKG01".
psr-1 : constants MUST be declared in all upper case
source : psr-1

Creating arrays dynamically using PHP

Hey folks, please lend a hand to a PHP beginner. I'm trying to put a load of dynamically created variabled into an array to re-read later, reason is a SOAP message sent is a mess and im trying to create a less complicated array:
$placea = "place a";
$placeb = "place b";
$myarray = array();
echo "<pre>";
print_r($myarray);
echo "</pre>";
what i want to be able to do:
Array
(
[0] => [Place A] => Array
(
[0] => [Accommodation] => Array
(
[RoomId] => 001
[RoomAvail] => true
[Date] => 12.04.2011
)
[1] => [Accommodation] => Array
(
[RoomId] => 002
[RoomAvail] => true
[Date] => 12.04.2011
)
) Array
(
[1] => [Place B] => Array
(
[0] => [Accommodation] => Array
(
[RoomId] => 101
[RoomAvail] => true
[Date] => 12.04.2011
)
[1] => [Accommodation] => Array
(
[RoomId] => 102
[RoomAvail] => true
[Date] => 12.04.2011
)
)
)
how would i write that out in php? sorry if its bleek and/or the array structure is incorrect
So you just need to use the array initializer repetitively.
If you want to initialize an array in PHP with some values, say 1 through 4, you make a call like:
$foo = array(1, 2, 3, 4);
And if you want to make an associative array, where you store some key/value pairs, you make a call like:
$foo = array('key' => 'value', 'other key' => 'other value');
But you can of course nest calls, and mix and match layers of associative and non associative arrays to achieve something like your example, e.g.:
$foo = array(
'Place A' => array(
// note use of first array on the next line is
// to generate structure like [0] => 'Accomodation' => ...
array('Accomodation' => array(
'RoomId' => '001',
'RoomAvail' => true,
'Date' => '12.04.2011')
)),
array('Accomodation' => array(
'RoomId' => '002',
'RoomAvail' => true,
'Date' => '12.04.2011')
))
),
'Place B' => array(
array('Accomodation' => array(
'RoomId' => '101',
'RoomAvail' => true,
'Date' => '12.04.2011')
)),
array('Accomodation' => array(
'RoomId' => '102',
'RoomAvail' => true,
'Date' => '12.04.2011')
))
)
);
This will very nearly produce what you're looking for, to make it replicate exactly what you have you would wrap each 'Place A' with an array and each "place" would get its own assignment to some variable $foo (I assumed this wasn't actually what you wanted and wrote something maybe slightly more intuitive).
If you want to have a 'less complicated' array, you have a two arrays, one fore place a and one for place b and then merge them using array_merger() http://www.php.net/manual/en/function.array-merge.php.
Study up on the array functions control structures in the manual. Many different ways of achieving bloated arrays uglying up your code.
This would dynamically create an array.
foreach($soapResponse as $key1 => $value1){
foreach($value as $key2 => $value2){
// $key1 = Place A or B
// value1 = array of values
$arrayResponse[$key1][$key2] = $value2;
}
}

Categories