Array format php - php
I need to change the format of an array returned in CodeIgniter, leaving a field of the database as index, I made the same querys in PHP and CodeIgniter and both are different, any suggestions? I am using result_array () in CodeIgniter and also result ();
I need this:
Array
(
[1_1] => Array
(
[0] => 1_1
[1] => 16
[2] => ch
[3] => Chemistry
)
[1_2] => Array
(
[0] => 1_2
[1] => 17
[2] => ch
[3] => Chemistry
)
[2_3] => Array
(
[0] => 2_3
[1] => 18
[2] => ch
[3] => Chemistry
)
[2_5] => Array
(
[0] => 2_5
[1] => 19
[2] => ch
[3] => Chemistry
)
[9_1] => Array
(
[0] => 9_1
[1] => 20
[2] => ch
[3] => Chemistry
)
)
Query results:
Array
(
[0] => Array
(
[pos] => 1_1
[tbl_id] => 16
[sub_id] => ch
[sub_name] => Chemistry
)
[1] => Array
(
[pos] => 1_2
[tbl_id] => 17
[sub_id] => ch
[sub_name] => Chemistry
)
[2] => Array
(
[pos] => 2_3
[tbl_id] => 18
[sub_id] => ch
[sub_name] => Chemistry
)
[3] => Array
(
[pos] => 2_5
[tbl_id] => 19
[sub_id] => ch
[sub_name] => Chemistry
)
[4] => Array
(
[pos] => 9_1
[tbl_id] => 20
[sub_id] => ch
[sub_name] => Chemistry
)
)
How can I delete the array that is at the beginning? Thank you.
$array = [
[
'pos' => '1_1',
'tbl_id' => 16,
'sub_id' => 'ch',
'sub_name' => 'Chemistry'
]
];
$result = [];
foreach ($array as $data) {
$values = array_values($data);
$result[$data['pos']] = $values;
}
This will give you what you want.
Array
(
[1_1] => Array
(
[0] => 1_1
[1] => 16
[2] => ch
[3] => Chemistry
)
)
Related
Grouping php arrays and showing highest and lowest value in the array
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
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.)
How to change this kind of array arrangement into like this
I am getting data from Google Analytics API. The GA API returns these data: Array ( [0] => Array ( [0] => 00 [1] => bing [2] => 1 ) [1] => Array ( [0] => 00 [1] => google [2] => 12 ) [2] => Array ( [0] => 00 [1] => yahoo [2] => 1 ) [3] => Array ( [0] => 01 [1] => google [2] => 7 ) [4] => Array ( [0] => 02 [1] => google [2] => 5 ) [5] => Array ( [0] => 03 [1] => bing [2] => 1 ) [6] => Array ( [0] => 03 [1] => google [2] => 4 ) [7] => Array ( [0] => 04 [1] => google [2] => 7 ) [8] => Array ( [0] => 05 [1] => google [2] => 5 ) [9] => Array ( [0] => 05 [1] => yahoo [2] => 1 ) [10] => Array ( [0] => 06 [1] => bing [2] => 1 ) [11] => Array ( [0] => 06 [1] => google [2] => 2 ) [12] => Array ( [0] => 07 [1] => google [2] => 4 ) [13] => Array ( [0] => 08 [1] => bing [2] => 1 ) [14] => Array ( [0] => 08 [1] => google [2] => 8 ) [15] => Array ( [0] => 09 [1] => bing [2] => 4 ) [16] => Array ( [0] => 09 [1] => google [2] => 13 ) [17] => Array ( [0] => 10 [1] => bing [2] => 1 ) [18] => Array ( [0] => 10 [1] => google [2] => 19 ) [19] => Array ( [0] => 10 [1] => yahoo [2] => 1 ) [20] => Array ( [0] => 11 [1] => bing [2] => 1 ) [21] => Array ( [0] => 11 [1] => google [2] => 23 ) [22] => Array ( [0] => 11 [1] => yahoo [2] => 1 ) [23] => Array ( [0] => 12 [1] => bing [2] => 1 ) [24] => Array ( [0] => 12 [1] => google [2] => 18 ) [25] => Array ( [0] => 13 [1] => bing [2] => 1 ) [26] => Array ( [0] => 13 [1] => google [2] => 17 ) [27] => Array ( [0] => 13 [1] => yahoo [2] => 1 ) [28] => Array ( [0] => 14 [1] => bing [2] => 3 ) [29] => Array ( [0] => 14 [1] => google [2] => 30 ) [30] => Array ( [0] => 14 [1] => yahoo [2] => 2 ) [31] => Array ( [0] => 15 [1] => google [2] => 15 ) [32] => Array ( [0] => 15 [1] => yahoo [2] => 2 ) [33] => Array ( [0] => 16 [1] => bing [2] => 1 ) [34] => Array ( [0] => 16 [1] => google [2] => 22 ) [35] => Array ( [0] => 16 [1] => yahoo [2] => 1 ) [36] => Array ( [0] => 17 [1] => google [2] => 18 ) [37] => Array ( [0] => 17 [1] => yahoo [2] => 2 ) [38] => Array ( [0] => 18 [1] => google [2] => 15 ) [39] => Array ( [0] => 19 [1] => bing [2] => 1 ) [40] => Array ( [0] => 19 [1] => google [2] => 18 ) [41] => Array ( [0] => 19 [1] => yahoo [2] => 3 ) [42] => Array ( [0] => 20 [1] => google [2] => 15 ) [43] => Array ( [0] => 21 [1] => google [2] => 18 ) [44] => Array ( [0] => 21 [1] => yahoo [2] => 1 ) [45] => Array ( [0] => 22 [1] => bing [2] => 1 ) [46] => Array ( [0] => 22 [1] => google [2] => 21 ) [47] => Array ( [0] => 23 [1] => google [2] => 8 ) [48] => Array ( [0] => 23 [1] => yahoo [2] => 1 ) ) I want that array to form like this: $example_data = array( array('00',1,12,1),//bing,google,yahoo array('01',0,7,0), array('02',0,5,0), array('03',1,4,0), array('04',0,7,0), array('05',0,5,1), array('06',1,2,0), array('07',0,7,0), array('08',1,8,0), array('09',0,13,0), array('10',1,19,1), //should have more arrays in here, but I hope you got my point... ); So basically, all the 00 of bing,google, and yahoo is being grouped by on a single array, then the other 01,02,03,etc.. are to be grouped by on a single array again. So if you noticed that we have a zero on this array array('01',0,7,0), it because bing doesn't have a 01 value in the array, and yahoo also doesn't have a 01 value in the array, except for google which has a 01 that has a value of 7. Any help how to transform this kind of array to the one I posted. Your help will be greatly appreciated! Thanks!
<?php $array=json_decode('[["00","bing","1"],["00","google","12"],["00","yahoo","1"],["01","google","7"],["02","google","5"],["03","bing","1"],["03","google","4"],["04","google","7"],["05","google","5"],["05","yahoo","1"],["06","bing","1"],["06","google","2"],["07","google","4"],["08","bing","1"],["08","google","8"],["09","bing","4"],["09","google","13"],["10","bing","1"],["10","google","19"],["10","yahoo","1"],["11","bing","1"],["11","google","23"],["11","yahoo","1"],["12","bing","1"],["12","google","18"],["13","bing","1"],["13","google","17"],["13","yahoo","1"],["14","bing","3"],["14","google","30"],["14","yahoo","2"],["15","google","15"],["15","yahoo","2"],["16","bing","1"],["16","google","22"],["16","yahoo","1"],["17","google","18"],["17","yahoo","2"],["18","google","15"],["19","bing","1"],["19","google","18"],["19","yahoo","3"],["20","google","15"],["21","google","18"],["21","yahoo","1"],["22","bing","1"],["22","google","21"],["23","google","8"],["23","yahoo","1"]]'); $temp=array(); $temp1=array(); foreach($array as $arr){ if(array_search($arr[0], $temp)===FALSE) $temp[]=$arr[0]; } foreach($temp as $t){ $bing=0; $google=0; $yahoo=0; foreach($array as $arr){ if($t==$arr[0]){ if($arr[1]=='bing'){ $bing=$arr[2]; }else if($arr[1]=='google'){ $google=$arr[2]; }else if($arr[1]=='yahoo'){ $yahoo=$arr[2]; } } } $temp1[]=array($t,$bing,$google,$yahoo); } var_dump($temp1); ?>
I managed to answer it on my own, not sure if this is efficient but it works! :) //$new variable is the array that I the google analytics api returned foreach($new as $key => $value){ if($value[1] == 'bing') $combine['bing'][$value[0]] = $value[2]; if($value[1] == 'google') $combine['google'][$value[0]] = $value[2]; if($value[1] == 'yahoo') $combine['yahoo'][$value[0]] = $value[2]; } $example_data = array(); for($i=0;$i<=23;$i++){ $tempI = $i; if($i < 10) $tempI = "0".$i; $bing = 0; $google = 0; $yahoo = 0; if(isset($combine['bing'][$tempI])){ $bing = $combine['bing'][$tempI]; } if(isset($combine['google'][$tempI])){ $google = $combine['google'][$tempI]; } if(isset($combine['yahoo'][$tempI])){ $yahoo = $combine['yahoo'][$tempI]; } //time,bing,google,yahoo $example_data[$i][0] = $tempI; $example_data[$i][1] = $bing; $example_data[$i][2] = $google; $example_data[$i][3] = $yahoo; } echo "<pre>"; print_r($example_data); echo "</pre>"; Thanks again StackOverflow! :)
How about this: <?php $initial = [ [ '00', 'bing', 1 ], [ '00', 'google', 12 ], [ '00', 'yahoo', 1 ], [ '01', 'google', 7 ], [ '02', 'google', 5 ], [ '03', 'bing', 1 ], [ '03', 'google', 4 ], ]; $searchEngines = ['bing', 'google', 'yahoo' ]; $temp = []; foreach ( $initial as $data ) { // Create array of the type $data['00']['google'] = 12 $temp[ $data[0] ][ $data[1] ] = $data[2]; } $final = []; // Now go over the newly created array foreach( $temp as $code => $entry ) { // Initialize a new array holding initially that $code ( I don't know if $code is correct term though ) $temp2 = [ $code ]; // And now for each of the defined search engines foreach( $searchEngines as $se ) { // Check if we have a value set if (isset( $entry[$se] ) ) { // If we do - use it $temp2[] = $entry[$se]; } else { // Otherwise use 0 $temp2[] = 0; } } // Set it to the final resulting array $final[] = $temp2; } echo '<pre>';print_r( $final );echo '</pre>'; And if someday you decide to add another search engine to the list all you'll have to do will be to add it to the $searchEngines array.
Replace numeric array keys with associative keys from array
I have a dataset similar to this in which I am trying to replace the numeric key values within DATA to the corresponding values in COLUMNS. I can do this in a loop but I don't think I'm doing it in the most efficient way possible. Can anyone suggest any nice functions that I haven't considered to accomplish this? Existing Style stdClass Object ( [COLUMNS] => Array ( [0] => MATCHID [1] => SEASON [2] => COMPETITION [3] => ROUNDID [4] => ROUNDSORT [5] => ROUNDNAME ) [DATA] => Array ( [0] => Array ( [0] => 141627 [1] => 2013/2014 [2] => The Scottish Cup [3] => 18 [4] => 11 [5] => Final ) [1] => Array ( [0] => 140895 [1] => 2013/2014 [2] => The Scottish Cup [3] => 16 [4] => 10 [5] => Semi-Final ) ) ) Desired Style stdClass Object ( [COLUMNS] => Array ( [0] => MATCHID [1] => SEASON [2] => COMPETITION [3] => ROUNDID [4] => ROUNDSORT [5] => ROUNDNAME ) [DATA] => Array ( [0] => Array ( [MATCHID] => 141627 [SEASON] => 2013/2014 [COMPETITION] => The Scottish Cup [ROUNDID] => 18 [ROUNDSORT] => 11 [ROUNDNAME] => Final ) [1] => Array ( [MATCHID] => 140895 [SEASON] => 2013/2014 [COMPETITION] => The Scottish Cup [ROUNDID] => 16 [ROUNDSORT] => 10 [ROUNDNAME] => Semi-Final ) ) )
foreach ($data->DATA as $key => $array) { $data->DATA[$key] = array_combine($data->COLUMNS, $array); } $data is the object you showed. Loop trough the data and combine the keys with the data, see array_combine
$data->DATA = array_map(function (array $entry) use ($data) { return array_combine($data->COLUMNS, $entry); }, $data->DATA);
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);