I have multidimensional arrays with which I need to make a table in html. I have a problem with matching catalog numbers with dates in the table.
I created an array (little part of it below):
array cotains date => CatalogNo => [catalogNo],[count],[date]
Array
(
[2019/07/19] => Array
(
[71156] => Array
(
[catalogNo] => 71156
[count] => 22
[date] => 2019/07/19
)
[71157] => Array
(
[catalogNo] => 71157
[count] => 21
[date] => 2019/07/19
)
[71221] => Array
(
[catalogNo] => 71221
[count] => 217
[date] => 2019/07/19
)
)
[2019/07/18] => Array
(
[71156] => Array
(
[catalogNo] => 71156
[count] => 26
[date] => 2019/07/18
)
[71157] => Array
(
[catalogNo] => 71157
[count] => 25
[date] => 2019/07/19
)
[71221] => Array
(
[catalogNo] => 71221
[count] => 281
[date] => 2019/07/19
)
[71222] => Array
(
[catalogNo] => 71221
[count] => 173
[date] => 2019/07/19
)
...
I did something like this but this is just bad. I dont know how to do it actually.
$dane_arr <- this is the whole array
<table>
<tr>
<th>CatalogNo</th>
<?php
foreach( $dane_arr as $k => $v )
{
?>
<th><?php echo $k ?></th>
<?php
}
?>
</tr>
<?php
foreach( $dane_arr as $k_date => $date_ )
{
foreach( $date_ as $k_nrArt_ => $nrArt_ )
{ ?>
<tr>
<td><?php echo $nrArt_['catalogNo'] ?></td>
<td><?php echo $nrArt_['count'] ?></td>
</tr>
<?php
}
}
?>
`
There are duplicates in CatalogNo and of course dates doesn't fit.
I want to create table, something like that:
CatalogNo | 2019/07/18 | 2019/07/19 | ...
71156 26 22 ...
71157 25 21 ...
71221 281 217 ...
71222 173 0 ...
(Of course without duplicates in 'CatalogNo')
You would first need to rearrange your array. Then you get all dates, and create the table:
<?php
$catalogUsage = [];
foreach ($dane_arr as $date => $catalogs) {
foreach( $catalogs as $catalogNo => $catalog) {
$catalogUsage[$catalogNo][$date] = $catalog['count'];
}
}
$allDates = array_keys($dane_arr);
?>
<table>
<tr>
<th>CatalogNo</th>
<?php
foreach ($allDates as $date) {
echo "<th>$date</th>"
}
?>
</tr>
<?php
foreach($catalogUsage as $catalogNo => $counts)
{
echo "<tr><td>$catalogNo</td>";
foreach ($allDates as $date) {
echo "<td>" . (isset($counts[$date]) ? $counts[$date] : 0) . "</td>";
}
echo "</tr>";
}
?>
</table>
Code is untested, since I haven't got the original array, so bugs might exist. I just hope this gives you some new inspiration.
Related
I'm trying to learn php and talk to an API to retrieve info for my Destiny 2 clan. I've retrieved all the info that I needed and build a new array with the following format:
Array
(
[displayname] => Senaxx
[membershipId] => 4611686018428643772
[characterdetails] => Array
(
[0] => Array
(
[2305843009260824684] => Array
(
[characterlevel] => 30
[light] => 384
[datelastplayed] => 2018-08-19T13:23:27Z
[minutesplayed] => 14901
[racehash] => 898834093
[genderhash] => 3111576190
[emblempath] => /common/destiny2_content/icons/2b6160e0f21e748cd996b404771a850c.jpg
[emblemhash] => 10493725
)
)
[1] => Array
(
[2305843009260824685] => Array
(
[characterlevel] => 30
[light] => 394
[datelastplayed] => 2018-08-18T20:47:09Z
[minutesplayed] => 9647
[racehash] => 2803282938
[genderhash] => 3111576190
[emblempath] => /common/destiny2_content/icons/dcfe74b7a343dd28bd45eee4ea59a1f7.jpg
[emblemhash] => 3860733295
)
)
[2] => Array
(
[2305843009260824686] => Array
(
[characterlevel] => 30
[light] => 394
[datelastplayed] => 2018-08-26T00:15:50Z
[minutesplayed] => 1802
[racehash] => 2803282938
[genderhash] => 3111576190
[emblempath] => /common/destiny2_content/icons/dcfe74b7a343dd28bd45eee4ea59a1f7.jpg
[emblemhash] => 3860733295
)
)
)
)
Array
(
[displayname] => base1981
[membershipId] => 4611686018433367605
[characterdetails] => Array
(
[0] => Array
(
[2305843009265162076] => Array
(
[characterlevel] => 30
[light] => 358
[datelastplayed] => 2018-08-15T11:58:46Z
[minutesplayed] => 13732
[racehash] => 2803282938
[genderhash] => 3111576190
[emblempath] => /common/destiny2_content/icons/9d512efea06e54c1768d434e53510092.jpg
[emblemhash] => 1291068173
)
)
[1] => Array
(
[2305843009265162077] => Array
(
[characterlevel] => 1
[light] => 100
[datelastplayed] => 2017-09-06T14:25:35Z
[minutesplayed] => 0
[racehash] => 898834093
[genderhash] => 2204441813
[emblempath] => /common/destiny2_content/icons/911791e90f955fc637398ea88aba74b7.jpg
[emblemhash] => 1907674137
)
)
[2] => Array
(
[2305843009265162078] => Array
(
[characterlevel] => 30
[light] => 350
[datelastplayed] => 2018-05-27T12:07:38Z
[minutesplayed] => 1658
[racehash] => 3887404748
[genderhash] => 3111576190
[emblempath] => /common/destiny2_content/icons/da0d265bb9e4473c97ba56dc7602ca73.jpg
[emblemhash] => 3941202506
)
)
)
)
These are only 2 player arrays. My whole code has 8. But for this example I think 2 of them will suffice.
My goal is to loop trough the array and retreive all the player info for each displayname.
So i started with which works perfectly:
foreach($claninfo as $clanmember)
{
echo $clanmember['membershipId'];
}
Only grabbing the characterdetails doesn't work for me sadly enough.
The problem for mee seems that there is an extra characterId with an unknown number.
foreach($claninfo as $clanmember)
{
echo $clanmember['membershipId'];
foreach($claninfo->characterdetails as $characterdetails)
{
echo $characterdetails-> light;
}
}
Ultimate goal is to have a table with some of the info in it:
<table>
<tbody>
<tr>
<td>Displayname</td>
<td>Playtime</td>
<td>Character 1</td>
<td>Character 2</td>
<td>Character 3</td>
</tr>
<tr>
<td>Senaxx</td>
<td> </td>
<td>light 384</td>
<td>light 394</td>
<td>light 394</td>
</tr>
<tr>
<td>Base1981</td>
<td> </td>
<td>light 358</td>
<td>light 100</td>
<td>light 350</td>
</tr>
</tbody>
</table>
The associative array key for till the light is:
$claninfo[<some key or index>]['characterdetails'][<Array Index>][<character id>]['light']
So to access light you need to use foreach 3 times:
To get clanmember from claninfo
To iterate $clanmember['characterdetails']
To get rid of character id
foreach($claninfo as $clanmember)
{
echo $clanmember['membershipId'];
foreach($clanmember['characterdetails'] as $characterArray)
{
foreach($characterArray as $characterid => $characterdetails)
{ // You can access $characterid in this block
echo $characterdetails['light'];
}
}
}
characterdetails is an array and not an object.
You can loop through the array using the following code
foreach($claninfo as $clanmember)
{
echo $clanmember['membershipId'];
foreach($claninfo['characterdetails'] as $characterdetails)
{
echo $characterdetails['light'];
}
}
It looks like there are 3 different problems with your code. You are working on arrays, you should not use object notation (->) at all. You use the wrong array in your inner foreach. Third, and this is probably your real question, you need a way to access a key that you don't know (unknown id). That last one can be circumvented for example with array_values (manual). All together:
foreach($claninfo as $clanmember)
{
echo $clanmember['membershipId'];
foreach($clanmember['characterdetails'] as $characterdetails)
{
echo array_values($characterdetails)[0]['light'];
}
}
My final solution was:
foreach($claninfo as $clanmember)
{
echo '<br><b>' . $clanmember['displayname'] . '</b><br>' ;
foreach($clanmember['characterdetails'] as $characterArray)
{
$characterId = $characterArray['characterId'];
$characterlight = $characterArray['light'];
$characterlevel = $characterArray['characterlevel'];
$characterlastplayed = $characterArray['datelastplayed'];
$characterminutesplayed = $characterArray['minutesplayed'];
$characterracehash = $characterArray['racehash'];
$charactergenderhash = $characterArray['genderhash'];
$characteremblempath = $characterArray['emblempath'];
$characteremblemhash = $characterArray['emblemhash'];
echo 'CharacterId: ' . ($characterId) . '<br>';
echo 'Light: ' . ($characterlight) . '<br>';
echo 'level: ' . ($characterlevel) . '<br>';
echo 'Last Played: ' . ($characterlastplayed) . '<br>';
echo 'Minutes Played: ' . ($characterminutesplayed) . '<br>';
echo 'RaceHash: ' . ($characterracehash) . '<br>';
echo 'GenderHash: ' . ($charactergenderhash) . '<br>';
echo 'Emblempath: ' . ($characteremblempath) . '<br>';
echo 'Emblemhash: ' . ($characteremblemhash) . '<br>';
echo '<br>';
}
}
I've this column in database table:
value=[
{"srno":1,
"name":"Gaspari Aminolast ",
"quantity":"2",
"price":"2920.0000",
"total_bill":5840
},
{"srno":2,
"name":"Gaspari Amino Max ",
"quantity":"2",
"price":"2640.0000",
"total_bill":5280
},
{"srno":3,
"name":"Myofusion 10Lbs",
"quantity":"2",
"price":"8400.0000",
"total_bill":16800}
]
And my php code is:
<?php
$getbill="select value from $tbl where bill_id='$_GET[id]' ";
$result=mysql_query($getbill)or die(mysql_error());
$results = array();
while($row=mysql_fetch_array($result))
{
$results[] = json_decode($row['value']);
}
print_r($results);
foreach($results as $key=>$value){
?>
<tbody>
<tr>
<td><?php echo $value['srno'];?></td>
<td><?php echo $value['name'];?></td>
<td><?php echo $value['quantity'];?></td>
<td><?php echo $value['price'];?></td>
<td ><?php echo $value['total_bill'];?></td>
</tr>
</tbody>
<?PHP
}
?>
I'm confused with how I loop through this and print all it contains.
print_r() :
Array (
[0] => Array (
[0] => stdClass Object (
[srno] => 1
[name] => Gaspari Aminolast
[quantity] => 2
[price] => 2920.0000
[total_bill] => 5840
)
[1] => stdClass Object (
[srno] => 2
[name] => Gaspari Amino Max
[quantity] => 2
[price] => 2640.0000
[total_bill] => 5280
)
[2] => stdClass Object (
[srno] => 3
[name] => Myofusion 10Lbs
[quantity] => 2
[price] => 8400.0000
[total_bill] => 16800
)
)
)
use second argument in json_decode function,set it to TRUE to get as array
$json='[{"srno":1,"name":"Gaspari Aminolast ","quantity":"2","price":"2920.0000","total_bill":5840},{"srno":2,"name":"Gaspari Amino Max ","quantity":"2","price":"2640.0000","total_bill":5280},{"srno":3,"name":"Myofusion 10Lbs","quantity":"2","price":"8400.0000","total_bill":16800}]';
echo '<pre>';print_r(json_decode($json,TRUE));
output:
Array
(
[0] => Array
(
[srno] => 1
[name] => Gaspari Aminolast
[quantity] => 2
[price] => 2920.0000
[total_bill] => 5840
)
[1] => Array
(
[srno] => 2
[name] => Gaspari Amino Max
[quantity] => 2
[price] => 2640.0000
[total_bill] => 5280
)
[2] => Array
(
[srno] => 3
[name] => Myofusion 10Lbs
[quantity] => 2
[price] => 8400.0000
[total_bill] => 16800
)
)
The array your trying to loop over seems to be in another array.
Try this or #RiggsFolly's answer
<table>
<?php
$getbill="select value from $tbl where bill_id='$_GET[id]' ";
$result=mysql_query($getbill)or die(mysql_error());
$results = array();
while($row=mysql_fetch_array($result))
{
$results = json_decode($row['value']);
}
print_r($results);
foreach($results as $key=>$value){
?>
<tr>
<td><?php echo $value['srno'];?></td>
<td><?php echo $value['name'];?></td>
<td><?php echo $value['quantity'];?></td>
<td><?php echo $value['price'];?></td>
<td ><?php echo $value['total_bill'];?></td>
</tr>
<?PHP
}
?>
</table>
If you notice, now I reformatted the value column, each value column contains a JSON string denoting an array of objects.
So for each value you store in the $results array you neeed to do another loop to examine the inner array of objects. Like so:
<?php
$getbill="select value from $tbl where bill_id='{$_GET[id]}' ";
$result=mysql_query($getbill)or die(mysql_error());
$results = array();
while($row=mysql_fetch_array($result))
{
$results[] = json_decode($row['value']);
}
print_r($results);
echo '<tbody>';
foreach($results as $value) :
foreach( $value as $object) :
?>
<tr>
<td><?php echo $object->srno;?></td>
<td><?php echo $object->name;?></td>
<td><?php echo $object->quantity;?></td>
<td><?php echo $object->price;?></td>
<td><?php echo $object->total_bill;?></td>
</tr>
<?php
endforeach;
endforeach;
?>
</tbody>
I also moved the <tbody> and </tbody> outside the loop as that would also have caused a problem with your layout.
As I am exploring arrays and how to use it
I encounter this unusual array.
I am trying to achieve this ouput using the array I have posted below.
How can I get this done?
<table>
<tr>
<th>DOGS</th>
<th>CATS</th>
<th>BIRDS</th>
</tr>
<tr>
<td><?php echo $dogs;?></td>
<td><?php echo $cats;?></td>
<td><?php echo $birds;?></td>
</tr>
</table>
Array
(
[cats] => Array
(
[0] => persian
[1] => ragdoll
[2] => siberian
[3] => savannah
)
[dogs] => Array
(
[0] => husky
[1] => bulldog
[2] => beagle
[3] => labrador
)
[birds] => Array
(
[0] => parrot
[1] => owl
[2] => eagle
[3] => love birds
)
)
This is the output I really need to get:
DOGS CATS BIRDS
husky persian parrot
bulldog ragdoll owl
beagle siberian eagle
labrador savannah love birds
You need to loop them first, you cannot outright echo arrays:
$animals = array(
'dogs' => array('husky', 'bulldog', 'beagle', 'labrador'),
'cats' => array('persian', 'ragdoll', 'siberian', 'savannah'),
'birds' => array('parrot', 'owl', 'eagle', 'love birds'),
);
?>
<table cellpadding="10">
<tr><th>DOGS</th><th>CATS</th><th>BIRDS</th></tr>
<?php
$types = array_keys($animals);
for($i = 0; $i < count($animals['cats']); $i++) {
echo '<tr>';
foreach($types as $type) {
echo '<td>' . $animals[$type][$i] . '</td>';
}
echo '</tr>';
}
?>
</table>
Sample Output
This question already has answers here:
How can I sort arrays and data in PHP?
(14 answers)
Closed 8 years ago.
I'm trying to sort through an array first by [artist][0][name], then by [datetime] so I end up with something like
9/25 - Artist1
9/26 - Artist1
9/27 - Artist1
9/25 - Artist2
9/26 - Artist2
9/27 - Artist2
...
This is how I get the data from the feed:
Array
(
[0] => Array
(
[ticket_url] => ...
[on_sale_datetime] => ...
[ticket_status] => ...
[url] => ...
[venue] => Array
(
[longitude] => ...
[region] => ...
[city] => ...
[url] => ...
[country] => ...
[id] => ...
[latitude] => ...
[name] => ...
)
[artists] => Array
(
[0] => Array
(
[mbid] => ...
[url] => ...
[name] => ...
)
)
[datetime] => ...
[id] => ...
)
)
I can sort by [name] just fine but can't figure out how to get the [datetime] to go in order along with each [name]. Here's what I have so far:
$object = $x->eventSearch($artists, $location, null, "$today,$next_week", 1, 100);
$array = objectToArray($object);
usort($array, function($a, $b) {
return strcmp($a['artists'][0]['name'], $b['artists'][0]['name']);
});
foreach ($array as $key => $val)
{
$main_artist = $val[artists][0][name];
$dateofevent = date("m/d", strtotime($val[datetime]));
$venue_city = $val[venue][city];
$venue_region = $val[venue][region];
$venue_name = $val[venue][name];
?>
<tr>
<td><?php echo $dateofevent; ?></td>
<td><?php echo $main_artist; ?></td>
<td><?php echo $venue_city . ", " . $venue_region; ?></td>
<td><?php echo $venue_name; ?></td>
</tr>
<?php } ?>
Any insight would be greatly appreciated.
Do something like the following to sort by artist name, and then date/time.
usort($array, function($a, $b) {
$s = strcmp($a['artists'][0]['name'], $b['artists'][0]['name']);
if($s != 0 ) { return $s; }
datetime_comparison_here(); // your example data is helpfully '...'
});
I am using the Google Analytics V3 PHP OAuht API. When using Simple.php in Google Analytics API Example the data are returned as PHP arrays. I am using the following call to get a more detailed answer to some specific data. It works fine.
$ids = "ga:xxxxxx";
$start_date = "2011-01-01";
$end_date = "2011-11-30";
$metrics = "ga:visits,ga:pageviews";
$dimensions = "ga:browser";
$optParams = array('dimensions' => $dimensions);
$data = $service->data_ga->get($ids,$start_date,$end_date,$metrics,$optParams);
Output of the Array is
Data
Array
(
[kind] => analytics#gaData
[id] => https://www.googleapis.com/analytics/v3/data/ga?ids=ga:xxxxxxx&dimensions=ga:browser&metrics=ga:visits,ga:pageviews&start-date=2011-01-01&end-date=2011-11-30&start-index=1&max-results=1000
[query] => Array
(
[start-date] => 2011-01-01
[end-date] => 2011-11-30
[ids] => ga:xxxxxxxx
[dimensions] => ga:browser
[metrics] => Array
(
[0] => ga:visits
[1] => ga:pageviews
)
[start-index] => 1
[max-results] => 1000
)
[itemsPerPage] => 1000
[totalResults] => 220
[selfLink] => https://www.googleapis.com/analytics/v3/data/ga?ids=ga:xxxxx&dimensions=ga:browser&metrics=ga:visits,ga:pageviews&start-date=2011-01-01&end-date=2011-11-30&start-index=1&max-results=1000
[profileInfo] => Array
(
[profileId] => xxxxx
[accountId] => xxxxx
[webPropertyId] => UA-xxxxxx-x
[internalWebPropertyId] => xxxxxxxxxx
[profileName] => xxxxx.com
[tableId] => ga:xxxxxxxx
)
[containsSampledData] =>
[columnHeaders] => Array
(
[0] => Array
(
[name] => ga:browser
[columnType] => DIMENSION
[dataType] => STRING
)
[1] => Array
(
[name] => ga:visits
[columnType] => METRIC
[dataType] => INTEGER
)
[2] => Array
(
[name] => ga:pageviews
[columnType] => METRIC
[dataType] => INTEGER
)
)
[totalsForAllResults] => Array
(
[ga:visits] => 36197
[ga:pageviews] => 123000
)
[rows] => Array
(
[0] => Array
(
[0] => (not set)
[1] => 459
[2] => 1237
)
[1] => Array
(
[0] => 12345
[1] => 3
[2] => 3
)
[2] => Array
(
[0] => 440955
[1] => 1
[2] => 1
)
[3] => Array
(
[0] => Alexa Toolbar
[1] => 1
[2] => 1
)
[4] => Array
(
[0] => Android Browser
[1] => 4177
[2] => 9896
)
....
The [Rows] Array has 219 entries.
Now the problem. I have spent the last week trying to parse this into an HTML table or anything that looks presentable. I have come close, but it seems this multi-dimensional array is beyond what I am able to handle. I am also trying to keep the solution flexible enough to handle more metrics or dimensions if they are added as well. I am self-taught PHP, so maybe I am missing a function or two that could make this easier. Thanks again for any hints, tips of ideas to make this work.
I got a bit further, but I does not fully format the way I want...maybe someone can see where I went wrong
$output = $service->data_ga->get($ids,$start_date,$end_date,$metrics,$optParams);
echo'<table style="text-align: left; width: 100%;" border="1" cellpadding="2"
cellspacing="2">
<tbody><tr>';
foreach ($output['columnHeaders'] as $header) {
print "<td>";
printf('%25s', $header['name']);
print "</td>";
}
print "</tr>";
foreach ($output['rows'] as $row) {
print "<td>";
foreach ($row as $column)
printf('%25s', $column);
print "</td>";
}
print "\n";
echo'
</tbody>
</table>';
I still can't seem to get the rows to display right.
To get you on your way use
$data [rows][$i][$j][columnHeaders] [0][name]
$data [rows][$i][$j][columnHeaders] [1][name]
and for rows use something like
$data [rows][0][1]
You will have to get the variable via increment with something like:
var =(count($data [columnHeaders]));
for ($i='0'; $i<=$var; $i++) {
echo '.$data [columnHeaders] [$i][name].';}
This should get you on your way towards building your table. Good Luck!
The issue is in your foreach for the table body rows. You appear to have missed the rows out. Wrap it in another loop to print out tr around the set of tds.
This is what I used for printing out a table of analytics data:
$data = $analytics->data_ga->get('ga:' . $profileId, $dateFrom, $dateTo, $metrics, array('dimensions' => $dimensions));
<table>
<thead>
<tr>
<?php
foreach ($data->columnHeaders as $header) {
$headerName = ucwords(preg_replace('/(\w+)([A-Z])/U', '\\1 \\2', str_replace('ga:', '', $header->name)));
print '<th>';
printf('%s', $headerName);
print '</th>';
}
?>
</tr>
</thead>
<tbody>
<?php
foreach ($data->rows as $row) {
print '<tr>';
foreach ($row as $cell) {
print '<td>';
printf('%s', $cell);
print '</td>';
}
print '</tr>';
}
?>
</tbody>
</table>