I have array like this:
Array
(
[Tarik Oil] => Array
(
[Eurodizel] => 5
)
[INA] => Array
(
[Eurodizel] => 10
)
[HIFA] => Array
(
[Eurodizel] => 15
)
[Selex] => Array
(
[Eurodizel] => 1.96
)
)
I want to get min and max values of 'Eurodize'.
How I can do this at easiest way in PHP.
Thanks
I assume, that in reality you have something like
Array
(
[Tarik Oil] => Array
(
[Eurodizel] => 5,
[Super] => 6,
[LNG] => 4,
)
...
)
And will want to run the same query for the other products. If this is the case, you should create an orthognal array like
$newarray=array(
[Eurodizel] => array(),
[Super] => array(),
[LNG] => array(),
);
foreach ($yourarray as $k=>$v) {
foreach ($v as $kk=>$vv)
$newarry[$kk][$k]=$vv;
}
foreach ($newarray as $k=>$v)
asort($newarry[$k]);
Now you can find the cheapest Eurodizel with
$eurodizel=array_values($newarray['Eurodizel']);
$cheapest=$eurodizel[0];
Here is a function that may help with what you're looking for:
<?php
function getMax($array){
foreach($array as $key=>$value){
if(!isset($max)||$value['Eurodizel']>$max){$max=$value['Eurodizel'];}
}
return $max;
}
?>
Related
I have an array in PHP code below, and I want to convert this array to be grouped by data value. It's always hard to simplify arrays.
Original array:
Array
(
[0] => Array
(
[date] => 2017-08-22
[AAA] => 1231
)
[1] => Array
(
[date] => 2017-08-21
[AAA] => 1172
)
[2] => Array
(
[date] => 2017-08-20
[AAA] => 1125
)
[3] => Array
(
[date] => 2017-08-21
[BBB] => 251
)
[4] => Array
(
[date] => 2017-08-20
[BBB] => 21773
)
[5] => Array
(
[date] => 2017-08-22
[CCC] => 3750
)
[6] => Array
(
[date] => 2017-08-20
[CCC] => 321750
)
)
Below is my desired array:
Array
(
[2017-08-22] => Array
(
[AAA] => 1231
[CCC] => 3750
)
[2017-08-21] => Array
(
[AAA] => 1172
[BBB] => 251
)
[2017-08-20] => Array
(
[AAA] => 1125
[BBB] => 21773
[CCC] => 321750
)
)
It is also ok to have empty null value if the data doesn't exist. [BBB] => NULL for 2017-08-22.
Can anybody help? Thanks in advance...
A simple loop should do this..
$group = [];
foreach ($data as $item) {
if (!isset($group[$item['date']])) {
$group[$item['date']] = [];
}
foreach ($item as $key => $value) {
if ($key == 'date') continue;
$group[$item['date']][$key] = $value;
}
}
Here : this should do the work.
$dst_array = array();
foreach ($array as $outerval) {
foreach ($outerval as $key => $innerval) {
if ($key != 'date') {
$dst_array[$outerval['date']][$key] = $innerval;
}
}
}
It iterates through the array and then through the entries in each subarray. Any any that is not a date is assigned in the destination array in the subarray corresponding to its date and with its own current key.
I definitely wouldn't recommend any techniques that involve more than one loop -- this process can certainly be performed in a single loop.
If you like language construct iteration, use a foreach() loop: (Demo)
$result = [];
foreach ($array as $row) {
$date = $row['date'];
unset($row['date']);
$result[$date] = array_merge($result[$date] ?? [], $row);
}
var_export($result);
If you like to use functional programming and fewer global variables, use array_reduce(): (Demo)
var_export(
array_reduce(
$array,
function($accumulator, $row) {
$date = $row['date'];
unset($row['date']);
$accumulator[$date] = array_merge($accumulator[$date] ?? [], $row);
return $accumulator;
},
[]
)
);
These techniques unconditionally push data into the subarray with the key based on the date column value.
The above technique will work consistently even if the order of your subarray elements changes.
The ?? (null coalescing operator) is to ensure that array_merge() always has an array in the first parameter -- if processing the first occurrence of a given date, you simply merge the current iteration's data (what's left of it after unset() removes the date element) with an empty array.
I believe this solution will work for you:
<?php
$array = Array
(
0 => Array
(
'date' => '2017-08-22',
'AAA' => '1231',
),
1 => Array
(
'date' => '2017-08-21',
'AAA' => '1172',
),
2 => Array
(
'date' => '2017-08-20',
'AAA' => '1125'
),
3 => Array
(
'date' => '2017-08-21',
'BBB' => '251'
),
4 => Array
(
'date' => '2017-08-20',
'BBB' => '21773',
),
5 => Array
(
'date' => '2017-08-22',
'CCC' => '3750'
),
6 => Array
(
'date' => '2017-08-20',
'CCC' => '321750'
)
);
echo '<pre>';
$array1 = array('AAA' => null, 'BBB' => null, 'CCC' => null);
$array2 = array();
array_walk($array, function ($v) use (&$array2, $array1) {
$a = $v['date'];
if (!isset($array2[$a])) {
$array2[$a] = $array1;
}
unset($v['date']);
$array2[$a] = array_merge($array2[$a], $v);
});
print_r($array2);
Output
Array
(
[2017-08-22] => Array
(
[AAA] => 1231
[BBB] =>
[CCC] => 3750
)
[2017-08-21] => Array
(
[AAA] => 1172
[BBB] => 251
[CCC] =>
)
[2017-08-20] => Array
(
[AAA] => 1125
[BBB] => 21773
[CCC] => 321750
)
)
check output at: https://3v4l.org/NvLB8
Another approach (quick & dirty) making use of an arrays internal pointer:
$newArray = [];
foreach ($array as $childArray) {
$date = current($childArray);
$value = next($childArray); // this advances the internal pointer..
$key = key($childArray); // ..so that you get the correct key here
$newArray[$date][$key] = $value;
}
This of course only works with the given array structure.
Another perfect usage example for the PHP function array_reduce():
// The input array
$input = array(
0 => array(
'date' => '2017-08-22',
'AAA' => '1231',
),
// The rest of your array here...
);
$output = array_reduce(
$input,
function (array $carry, array $item) {
// Extract the date into a local variable for readability and speed
// It is used several times below
$date = $item['date'];
// Initialize the group for this date if it doesn't exist
if (! array_key_exists($date, $carry)) {
$carry[$date] = array();
}
// Remove the date from the item...
// ...and merge the rest into the group of this date
unset($item['date']);
$carry[$date] = array_merge($carry[$date], $item);
// Return the partial result
return $carry;
},
array()
);
The question is not clear. What is the expected result if one key (AAA f.e) is present on two or more dates? This answer keeps only the last value associated with it.
This is my json Output. i want to echo 'resolution' only. How is that possible?
Array
(
[uploader] => CoversDamian
[formats] => Array
(
[0] => Array
(
[preference] => -50
[resolution] => 720p
)
[1] => Array
(
[preference] => -100
[resolution] => 1080p
)
)
)
In the case you want to echo all resolutions you need a loop like this:
for ($i = 0; $i < sizeof($array["formats"]); $i++){
echo $array["formats"][$i]["resolution"];
}
Hope it helps!
Assuming the json is in object notation, stored as $json you can loop through the 'formats' as follows :
foreach($json->formats as $key=>$value) {
echo $value->resolution . "\n";
}
If it is not in object notation, you can loop through the sub-keys in the array (assuming it is store in the variable $json) as follows :
foreach($json['formats'] as $key=>$value) {
echo $value['resolution'] . "\n";
}
Notice the subtle difference in the way you can access sub-keys/elements in an object vs in an array.
$arr = array(
'uploader' => 'CoversDamian',
'formats' => array
(
0 => array
(
'preference' => '-50',
'resolution' => '720p'
),
1 => array
(
'preference' => -'100',
'resolution' => '1080p'
)
)
);
foreach ($arr['formats'] as $key=>$val) {
echo $val['resolution'];
}
$myarray = Array
(
[uploader] => CoversDamian
[formats] => Array
(
[0] => Array
(
[preference] => -50
[resolution] => 720p
)
[1] => Array
(
[preference] => -100
[resolution] => 1080p
)
)
)
echo $myarray["formats"][1]["resolution"];
if you have more array in formats key then you can use foreach loop based on formats key. Becuase you want to print all resolution under the formats key.
So
foreach($myarray["formats"] as $key => $value){
echo $value["resolution"]."<br>";
}
I have an array like so...
$myarray = Array (
[docs] => Array(
[0] => Array ([property_imgurl] => http://www.example.com/image1.jpg)
[1] => Array ([property_imgurl] => http://www.example.com/image2.jpg)
[2] => Array ( [property_imgurl] => http://www.example.com/image3.jpg)
[3] => Array ( [property_imgurl] => http://www.example.com/image4.jpg)
)
);
I am trying to echo out
foreach ($myarray as $myarrays) {
echo $myarray[property_imgurl];
}
But this isn't returning any results, what am I doing wrong?
Your key is invalid..
foreach ($myarray["docs"] as $myarrays) {
echo $myarrays["property_imgurl"];
}
Live preview
you need to add one more loop try
foreach ($myarray as $v) {
foreach ($v as $v1) {
echo $v1['property_imgurl'];
}
}
Your Array seems to be wrong here..
Try this:
$myarray =
Array (
"docs"=>
Array(
"0" => Array ( "property_imgurl" => "http://www.example.com/image1.jpg" ),
"1" => Array ( "property_imgurl" => "http://www.example.com/image2.jpg" ) ,
"2" => Array ( "property_imgurl" => "http://www.example.com/image3.jpg" ) ,
"3" => Array ( "property_imgurl" => "http://www.example.com/image4.jpg" ) )
);
And then iterate your loop like this:
foreach($myarray['docs'] as $key=>$value)
{
echo $value['property_imgurl'];
}
I have array like this. This array is created dynamically
Array
(
[Data NotUploading] => Array
(
[items] => Array
(
[0] => Array
(
[date] => 2013-04-02
[issue_id] => 1
[phone_service_device] => A
[phone_service_model] =>
[phone_service_os] =>
[phone_service_version] =>
[issue_name] => Data NotUploading
)
[1] => Array
(
[date] => 2013-04-02
[issue_id] => 1
[phone_service_device] => I
[phone_service_model] =>
[phone_service_os] =>
[phone_service_version] =>
[issue_name] => Data NotUploading
)
)
)
[Battery Problem] => Array
(
[items] => Array
(
[0] => Array
(
[date] => 2013-04-03
[issue_id] => 3
[phone_service_device] => I
[phone_service_model] =>
[phone_service_os] =>
[phone_service_version] =>
[issue_name] => Battery Problem
)
)
)
)
What I need to do is to use 2 foreach or 1 foreach & 1 for loop so that I can get each value of date I did like this
foreach($gResultbyName as $key1 => $rec){
for($j = 0;$j<count($rec);$j++ ){
echo $rec['items'][$j]['date'];
}
}
but its only retrieving 2013-04-02 & 2013-04-03 that is 0 index date of data NotUploading & 0 index date of Battery Problem. Basically I need to compare each value and others stuff but I just cant get each date value.
Forgive me for ignorance but I tried a lot :(
try this:
foreach ($data as $d)
{
foreach($d['items'] as $item)
{
echo $item['date'];
}
}
Your for-loop loops count($rec) times, but should count($rec['items']).
This should load the dates into an array sorted by the issue_name. The you can step through them for further processing.
$dates= array();
foreach ($gResultbyName AS $events){
foreach ($events['items'] AS $item){
$dates[$item['issue_name']][] = $item['date'];
}
}
var_dump($dates);
I have an array that looks like
Array
(
[1] => Array
(
[0] => Date
[1] => Action
)
[2] => Array
(
[0] => 2011-01-22 11:23:19
[1] => SHARE_TWEET
)
[3] => Array
(
[0] => 2011-01-22 11:23:19
[1] => SHARE_FACEBOOK
)
and many other different values (about 10), what I want to do is I want to count the number of times a string is in the array. I was going to use array_count_values but it doesn't count multidimensional arrays.
Any other options?
This could be done by first flattening the array, and then using array_count_values() on it:
For flattening, here is the trick:
$array = call_user_func_array('array_merge', $arrays);
And then:
$counts = array_count_values($array);
Output:
array (
'Date' => 1,
'Action' => 1,
'2011-01-22 11:23:19' => 2,
'SHARE_TWEET' => 1,
'SHARE_FACEBOOK' => 1,
)
Full code:
$array = call_user_func_array('array_merge', $arrays);
var_export(array_count_values($array));
Any time you're dealing with arrays, especially with loops in PHP I can't string enough suggest you look at the array documentation, You'd be suprised how quickly you realise most of the loops in your code is unnecessary. PHP has a built in function to achieve what you're after called array_walk_recursive. And since you're using PHP5 you can use closures rather that create_function (which can be very troublesome, especially to debug, and can't be optimised by the PHP interpreter afik)
$strings = array();
array_walk_recursive($arr, function($value, $key) use (&$strings) {
$strings[$value] = isset($strings[$value]) ? $strings[$value]+1 : 1;
});
I know, unary statements aren't always clear, but this one is simple enough, but feel free to expand out the if statement.
The result of the above is:
print_r($strings);
Array
(
[Date] => 1,
[Action] => 1,
[2011-01-22 11:23:19] => 2,
[SHARE_TWEET] => 1,
[SHARE_FACEBOOK] => 1,
)
Pseudo Code
$inputArray = // your array as in the example above
foreach ($inputArray as $key => $value) {
$result[$value[1]] = $result[$value[1]] + 1;
}
var_dump($result);
Here is a way to do the job:
$arr = Array (
1 => Array (
0 => 'Date',
1 => 'Action'
),
2 => Array (
0 => '2011-01-22 11:23:19',
1 => 'SHARE_TWEET'
),
3 => Array (
0 => '2011-01-22 11:23:19',
1 => 'SHARE_FACEBOOK'
)
);
$result = array();
function count_array($arr) {
global $result;
foreach($arr as $k => $v) {
if (is_array($v)) {
count_array($v);
} else {
if (isset($result[$v])) {
$result[$v]++;
} else {
$result[$v] = 1;
}
}
}
}
count_array($arr);
print_r($result);
output:
Array
(
[Date] => 1
[Action] => 1
[2011-01-22 11:23:19] => 2
[SHARE_TWEET] => 1
[SHARE_FACEBOOK] => 1
)