Grouping php arrays and showing highest and lowest value in the array - php

I have an array that looks like this:
Array
(
[0] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 1
)
[1] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 2
)
[2] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 3
)
[3] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 4
)
[4] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 5
)
[5] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 6
)
[6] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 7
)
[7] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 8
)
[8] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 9
)
[9] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 10
)
[10] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 11
)
[11] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 12
)
[12] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 20
)
[13] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 21
)
[14] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 22
)
[15] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 23
)
[16] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 24
)
[17] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 25
)
[18] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 26
)
[19] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 27
)
[20] => Array
(
[0] => 19.0001.2
[1] => 1
[2] => 33
)
[21] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 30
)
[22] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 35
)
[23] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 46
)
[24] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 47
)
[25] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 48
)
[26] => Array
(
[0] => 19.0001.2
[1] => 2
[2] => 50
)
[27] => Array
(
[0] => 19.0001.2
[1] => 3
[2] => 1
)
[28] => Array
(
[0] => 19.0001.3
[1] => 2
[2] => 40
)
[29] => Array
(
[0] => 19.0001.3
[1] => 2
[2] => 41
)
[30] => Array
(
[0] => 19.0001.3
[1] => 2
[2] => 42
)
[31] => Array
(
[0] => 19.0001.3
[1] => 3
[2] => 7
)
[32] => Array
(
[0] => 19.0001.3
[1] => 3
[2] => 8
)
[33] => Array
(
[0] => 19.0001.3
[1] => 3
[2] => 9
)
[34] => Array
(
[0] => 19.0001.3
[1] => 3
[2] => 13
)
[35] => Array
(
[0] => 19.0001.3
[1] => 4
[2] => 41
)
[36] => Array
(
[0] => 19.0001.4
[1] => 1
[2] => 2
)
[37] => Array
(
[0] => 19.0001.4
[1] => 1
[2] => 3
)
[38] => Array
(
[0] => 19.0001.4
[1] => 1
[2] => 4
)
[39] => Array
(
[0] => 19.0001.8
[1] => 4
[2] => 40
)
[40] => Array
(
[0] => 19.0009.8
[1] => 3
[2] => 8
)
)
I have a function that groups the last value in an array into a range of numbers, however it doesn't work with the above array. I have tried a number of different arrays with no success. The above array is generated by a mysql query result.
$getlocations = $db->query("
SELECT barcode
, test_num
, magnum
, sect
, slidenum
FROM fas_log
WHERE barcode LIKE '%$bcinv'
AND notes = '$notes'
AND removed = '$removed'
AND staffid= '$sid'
ORDER BY magnum, sect, slidenum
");
while ($getlocationsrow = $getlocations->fetch()) {
extract($getlocationsrow);
$magrange[]=array("$magnum", "$sect", "$slidenum");
}
function rangeslides($arr) {
$previous = null;
$result = array();
$consecutiveArray = array();
// Slice array by consecutive sequences
foreach($arr as $number) {
if ($number == $previous + 1) {
$consecutiveArray[] = $number;
} else {
$result[] = $consecutiveArray;
$consecutiveArray = array($number);
}
$previous = $number;
}
$result[] = $consecutiveArray;
// Get length of each sub array
$count = array_map('count', $result);
$first = reset($count);
$last = end($count);
prettyarray($result);
}
I want to extract data from the array to look like this showing the first and last numbers in the range:
19.0001.2 1 - 12
The above array should produce 15 different results with 9 of them showing no range of numbers because they are singular.
ie: 19.0001.8 4 40

Related

How do I use array_map recursively in PHP?

I am attempting to convert an associative array to a 2D array to allow me to export it to Google Sheets. I've figured out a simplistic solution that works as follows:
$headers = $data["resultSets"][0]["headers"];
$rowSet0 = $data["resultSets"][0]["rowSet"][0];
$rowSet1 = $data["resultSets"][0]["rowSet"][1];
$hackresults = array_map(null, $headers, $rowSet0, $rowSet1);
This produces the following:
(
[0] => Array
(
[0] => SEASON_ID
[1] => 22017
[2] => 22017
)
[1] => Array
(
[0] => Player_ID
[1] => 203954
[2] => 203954
)
[2] => Array
(
[0] => Game_ID
[1] => 0021701118
[2] => 0021701105
)
[3] => Array
(
[0] => GAME_DATE
[1] => MAR 28, 2018
[2] => MAR 26, 2018
)
[4] => Array
(
[0] => MATCHUP
[1] => PHI vs. NYK
[2] => PHI vs. DEN
)
[5] => Array
(
[0] => WL
[1] => W
[2] => W
)
[6] => Array
(
[0] => MIN
[1] => 9
[2] => 27
)
[7] => Array
(
[0] => FGM
[1] => 2
[2] => 6
)
[8] => Array
(
[0] => FGA
[1] => 6
[2] => 12
)
[9] => Array
(
[0] => FG_PCT
[1] => 0.333
[2] => 0.5
)
[10] => Array
(
[0] => FG3M
[1] => 0
[2] => 0
)
[11] => Array
(
[0] => FG3A
[1] => 1
[2] => 1
)
[12] => Array
(
[0] => FG3_PCT
[1] => 0
[2] => 0
)
[13] => Array
(
[0] => FTM
[1] => 1
[2] => 8
)
[14] => Array
(
[0] => FTA
[1] => 2
[2] => 10
)
[15] => Array
(
[0] => FT_PCT
[1] => 0.5
[2] => 0.8
)
[16] => Array
(
[0] => OREB
[1] => 2
[2] => 1
)
[17] => Array
(
[0] => DREB
[1] => 1
[2] => 12
)
[18] => Array
(
[0] => REB
[1] => 3
[2] => 13
)
[19] => Array
(
[0] => AST
[1] => 0
[2] => 2
)
[20] => Array
(
[0] => STL
[1] => 0
[2] => 1
)
[21] => Array
(
[0] => BLK
[1] => 0
[2] => 2
)
[22] => Array
(
[0] => TOV
[1] => 1
[2] => 4
)
[23] => Array
(
[0] => PF
[1] => 1
[2] => 5
)
[24] => Array
(
[0] => PTS
[1] => 5
[2] => 20
)
[25] => Array
(
[0] => PLUS_MINUS
[1] => 7
[2] => 20
)
[26] => Array
(
[0] => VIDEO_AVAILABLE
[1] => 1
[2] => 1
)
)
This is the output I'm looking for, but there are 27 "rowSet"s, and it seems there must be a recursive way of performing this task.
I've looked at a number of custom array_map_recursive style functions but haven't had any success. Apologies and thanks in advance, I am a terrible novice coder!
You can use argument unpacking.
With the ... operator, you can use all the elements under $data["resultSets"][0]["rowSet"] as additional arguments to array_map.
$headers = $data["resultSets"][0]["headers"];
$rowSets = $data["resultSets"][0]["rowSet"];
$results = array_map(null, $headers, ...$rowSets);
(This isn't recursion, but I think it does what you're trying to do.)

PHP delete from array

I have following array. How I can delete those values which doesn't have value in [1]? So if there's not "x", it will be deleted.
Before:
Array
(
[0] => Array
(
[0] => 1
[1] => x
[2] => name1
[3] => company1
[4] => 709
)
[1] => Array
(
[0] => 2
[1] => x
[2] => name2
[3] => company2
[4] => 500
)
.
.
.
[978] => Array
(
[0] => 946
[1] =>
[2] => name946
[3] => company946
[4] => 0
)
[979] => Array
(
[0] => 946
[1] => x
[2] => name946
[3] => company946
[4] => 0
)
[980] => Array
(
[0] => 946
[1] =>
[2] => name946
[3] => company946
[4] => 0
)
)
After:
Array
(
[0] => Array
(
[0] => 1
[1] => x
[2] => name1
[3] => company1
[4] => 709
)
[1] => Array
(
[0] => 2
[1] => x
[2] => name2
[3] => company2
[4] => 500
)
.
.
.
[979] => Array
(
[0] => 946
[1] => x
[2] => name946
[3] => company946
[4] => 0
)
)
Just loop on your table :
foreach($lines AS $k => $row) {
if($row[1] !== 'x') {
unset($lines[$k]);
}
}

determine average value from an array column

consider below array:-
Array
(
[0] => Array
(
[0] => 99895
[1] => 35378
[2] => 0.01
)
[1] => Array
(
[0] => 99895
[1] => 813
[2] => -0.97
)
[2] => Array
(
[0] => 99895
[1] => 771
[2] => 0.29
)
[3] => Array
(
[0] => 442
[1] => 833
[2] => -1.06
)
[4] => Array
(
[0] => 442
[1] => 485
[2] => -0.61
)
[5] => Array
(
[0] => 442
[1] => 367
[2] => -0.14
)
[6] => Array
(
[0] => 442
[1] => 478
[2] => 0.77
)
[7] => Array
(
[0] => 442
[1] => 947
[2] => -0.07
)
[8] => Array
(
[0] => 7977
[1] => 987
[2] => 0.76
)
[9] => Array
(
[0] => 7977
[1] => 819
[2] => 0.37
)
[10] => Array
(
[0] => 7977
[1] => 819
[2] => 0.36
)
[11] => Array
(
[0] => 7977
[1] => 653
[2] => 1.16
)
[12] => Array
(
[0] => 7977
[1] => 1653
[2] => 1.15
)
)
from the above array how will I determine the below array?
array
(
99895 => -0.223
442 => -0.22
7977 => 0.76
)
Actually I need the average value of column 3 in respect of column 1.
First collect all the column 3 elements into an array keyed off column 1:
$arrays = array();
foreach ($input as $vals) {
$key = $vals[0];
$val = $vals[2];
if (isset($arrays[$key])) {
$arrays[$key][] = $val;
} else {
$arrays[$key] = array($val);
}
}
Now go through all of them, calculating the averages:
foreach ($arrays as &$array) {
$array = array_sum($array)/count($array);
}

How to sum values via the same key and group by other key

I'd like to sum products by the same ref number, but I have 3rd parameter like dimension e.g. (..., 24, 26mm,...) and I can't sum this values only when they have the same dimension. I tried this: Group a multidimensional array by a particular value? but how to sum values?
My array looks like this:
Array
(
[0] => Array
(
[0] => 2
[1] => 790180X
[2] => 26mm
)
[1] => Array
(
[0] => 4
[1] => 762182Z
)
[2] => Array
(
[0] => 2
[1] => 072182X
)
[3] => Array
(
[0] => 4
[1] => 660122Y
)
[4] => Array
(
[0] => 2
[1] => 790180X
[2] => 24mm
)
[5] => Array
(
[0] => 1
[1] => 225160Y
)
[6] => Array
(
[0] => 1
[1] => 244160Y
)
[7] => Array
(
[0] => 1
[1] => 225160Y
)
[8] => Array
(
[0] => 8
[1] => 954120Y
)
[9] => Array
(
[0] => 3
[1] => 072182X
)
)
I'd like to something like this:
Array
(
[0] => Array
(
[0] => 2
[1] => 790180X
[2] => 26mm
)
[1] => Array
(
[0] => 2
[1] => 790180X
[2] => 24mm
)
[2] => Array
(
[0] => 4
[1] => 762182Z
)
[3] => Array
(
[0] => 5
[1] => 072182X
)
[4] => Array
(
[0] => 4
[1] => 660122Y
)
[5] => Array
(
[0] => 2
[1] => 225160Y
)
[6] => Array
(
[0] => 1
[1] => 244160Y
)
[7] => Array
(
[0] => 8
[1] => 954120Y
)
)
The array in short version:
Array => TO => Array
( (
[0] => 2:790180X:26mm [0] => 2:790180X:26mm
[1] => 4:762182Z [1] => 2:790180X:24mm
[2] => 2:072182X [2] => 4:762182Z
[3] => 4:660122Y [3] => 5:072182X
[4] => 2:790180X:24mm [4] => 4:660122Y
[5] => 1:225160Y [5] => 2:225160Y
[6] => 1:244160Y [6] => 1:244160Y
[7] => 1:225160Y [7] => 8:954120Y
[8] => 8:954120Y )
[9] => 3:072182X
)
Just sum into a new array, using the various "grouping" fields as keys in the new array:
$sums = array();
foreach ($yourarray as $element) {
$sums[$element['dimension1']][$element['dimension2']]++;
}
For every dimension you need to 'group' by, you add a key to the $sums array.

Is this the correct syntax for 'array_unique()' in PHP?

I want to get rid of duplicates in my array but I'm still printing duplicates with this:
$getuser = ltrim($top10['url'], " users/" ); //trim url to get user id
$array[$i++] = $getuser;
$dirty = $array;
$clean = array_unique($dirty);
print_r($clean)."<br />";
Input print_r($array)
Array ( [0] => 33 [1] => 3 [2] => 29 [3] => 3104 ) Array ( [0] => 156686 [1] => 5 [2] => 3104 [3] => 1 ) Array ( [0] => 2 [1] => 115023 [2] => 185367 [3] => 180694 ) Array ( [0] => 2 [1] => 5 [2] => 3104 [3] => 139403 ) Array ( [0] => 3110 [1] => 2723 [2] => 8087 [3] => 97410 ) Array ( [0] => 1925 [1] => 60 [2] => 18995 [3] => 2940 ) Array ( [0] => 103205 [1] => 111503 [2] => 2 [3] => 128715 ) Array ( [0] => 3 [1] => 119266 [2] => 4 [3] => 3104 ) Array ( [0] => 32565 [1] => 2743 [2] => 148584 [3] => 3505 ) Array ( [0] => 35282 [1] => 99136 [2] => 54167 [3] => 5326 )
Output print_r($clean);
Array ( [0] => 33 [1] => 3 [2] => 29 [3] => 3104 ) Array ( [0] => 156686 [1] => 5 [2] => 3104 [3] => 1 ) Array ( [0] => 2 [1] => 115023 [2] => 185367 [3] => 180694 ) Array ( [0] => 2 [1] => 5 [2] => 3104 [3] => 139403 ) Array ( [0] => 3110 [1] => 2723 [2] => 8087 [3] => 97410 ) Array ( [0] => 1925 [1] => 60 [2] => 18995 [3] => 2940 ) Array ( [0] => 103205 [1] => 111503 [2] => 2 [3] => 128715 ) Array ( [0] => 3 [1] => 119266 [2] => 4 [3] => 3104 ) Array ( [0] => 32565 [1] => 2743 [2] => 148584 [3] => 3505 ) Array ( [0] => 35282 [1] => 99136 [2] => 54167 [3] => 5326 )
Yes, it seems to be correct. Basically you specify an array to array_unique and it gives you unique items out of the array.
$unique_array = array_unique($your_array);

Categories