I have an array which looks like:
Array
(
[0] => Array
(
[total words] => 1476
)
[1] => Array
(
[keyword] => difference
[count] => 82
[percent] => 5.56
)
[2] => Array
(
[keyword] => 2010
[count] => 37
[percent] => 2.51
)
[3] => Array
(
[keyword] => very
[count] => 22
[percent] => 1.49
)
)
I want to show the array content in a table of three column and three rows. Each row contains keyword, count and percent as a column and Total. Words will be shown in table caption.
Please help me ! I'm trying to run a for loop but don't know how to show the array content, because it looks like a multi dimensional array. Please help me.
This should be what you're after.
print '<table>';
$headers = array_keys(reset($array));
print '<tr>';
foreach($headers as $header){
print '<th>'.$header.'</th>';
}
print '<tr>';
foreach($array as $row){
print '<tr>';
foreach($row as $col){
print '<td>'.$col.'</td>';
}
print '</tr>';
}
print '</table>';
Implode is your friend in this case:
$arrayLength = count($myArray);
echo '<table>';
for($i=0;$i<$arrayLength;$i++){
echo '<tr><td>'.
.implode('</td><td>',$myArray[$i])
.'</td></tr>';
}
echo '</table>';
http://us2.php.net/manual/en/function.implode.php
you can iterate through your array using a foreach($array => $value) loop.
this code should do the trick:
<table>
<tr>
<th>Keyword</th>
<th>Count</th>
<th>%</th>
</tr>
<?php foreach ( $data as $row ): ?>
<tr>
<td><?php echo $row['keyword']; ?></td>
<td><?php echo $row['count']; ?></td>
<td><?php echo $row['percent']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Lets say array is stored in variable $a.
foreach($item in $a) {
echo $item['keyword'] . " " . $item['count'] . " " . $item['percent'] . "<br>\n";
}
array_values — Return all the values of an array
print_r(array_values($array));
Further to Godea Andrei's answer above, if you are using print_r just use
print_r($array)
Calling array_values within the print_r call will strip off all associative naming of the array elements. If just using numerical array indexes it will still show the index value. E.g.
$a = array("red", "green", "blue");
print_r($a) will display
Array ( [0] => red [1] => green [2] => blue )
whereas
$b = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
print_r($b) will display
Array ( [Peter] => 35 [Ben] => 37 [Joe] => 43 )
If using array_values the output of the second example would be
Array ( [0] => 35 [1] => 37 [2] => 43 )
Related
I have two arrays, one with quantities called aantal and one with products called producten.
Producten:
Array
(
[0] => Array
(
[0] => 2
[1] => Tegel zwart
[2] => Zwarte tegel 2x2m
[3] => 47,5
[4] => 25
)
[1] => Array
(
[0] => 4
[1] => Tegel lichtgrijs
[2] => Lichtgrijze tegel 2x2m
[3] => 40,5
[4] => 25
)
[2] => Array
(
[0] => 2
[1] => Tegel zwart
[2] => Zwarte tegel 2x2m
[3] => 47,5
[4] => 25
)
[3] => Array
(
[0] => 4
[1] => Tegel lichtgrijs
[2] => Lichtgrijze tegel 2x2m
[3] => 40,5
[4] => 25
)
)
Aantal:
Array
(
[0] => 20
[1] => 20
[2] => 27
[3] => 25
)
I want to update each quantity according to the $_GET values from the url with the following code:
$sum = 0;
foreach($_SESSION['producten'] as $key => $product){
//$_SESSION['producten'][$key][4] = '';
$number = str_replace(',', '.', $product[3]);
$sum+= $number;
if(!empty($_GET['aantal'])){
foreach($_GET['aantal'] as $keyaantal => $aantal){
$_SESSION['producten'][$key][4] = $_GET['aantal'][$keyaantal];
}
}else{
$_SESSION['producten'][$key][4] = '1';
}
}
This is the form with the html:
<form action="cart.php">
<?php foreach ( $_SESSION['producten'] as $row){
if(!empty($_GET['aantal'])){
$aantalwaarde = $row[4];
}else{
$aantalwaarde = 1;
}
// if($row != ){
// }
?>
<tr>
<td><?php echo $row[0] // ID; ?></td>
<td><?php echo $row[1] // Product_naam; ?></td>
<td><?php echo $row[2] // Beschrijving; ?></td>
<td><input name="aantal[]" type="number" value="<?PHP echo $aantalwaarde; ?>"></td>
<td>€<?php echo $row[3] // Prijs; ?></td>
<?php $total = $total + intval($row[3]); ?>
</tr>
<?php } ?>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><input type="submit" value="Updaten"></td>
<td></td>
<td>Totaalprijs</td>
<td></td>
<td>€<?php echo $sum // Prijs; ?></td>
</tr>
</form>
Why if I click the update button, it updates the last inserted values for all products? For example if I set the last quantity input at 25 and the one before it at 10, all products have a quantity for 25.
How can I fix that?
Your inner foreach loop is the problem. You're going through all the quantities instead of picking the related one. So when the loop ends you're always left with the last one being added to your session.
I can't test right now but I think you should change
foreach($_GET['aantal'] as $keyaantal => $aantal){
$_SESSION['producten'][$key][4] = $_GET['aantal'][$keyaantal];
}
to
$_SESSION['producten'][$key][4] = $_GET['aantal'][$key];
That way, you select the matching key for both arrays.
You code has a big flaw. First, you iterate through the entire producten array. Within this array, you loop through the aantal array and update the values. That really doesn't make sense, you don't need that second loop at all. You can replace this entire part ...
foreach($_GET['aantal'] as $keyaantal => $aantal){
$_SESSION['producten'][$key][4] = $_GET['aantal'][$keyaantal];
}
... with this ...
$_SESSION['producten'][$key][4] = $_GET['aantal'][$key];
That should do the trick.
The problem with your loop was is that you iterated through the array and updated the value of your ['producten'][$key][4] with each iteration. That means the last value you're stuck with is always the last one.
There are similar questions on Stack Overflow but nothing quite like mine, and I also want to double check that I am doing this the most efficient way (resource wise).
I have surveys that are submitted and I want to tally the results. Each survey is saved in a multidimensional array like so:
Array ( [name] => Clark Kent [rating] => 5 )
These are coming from a loop as they are separate database entries.
So I am beginning by creating a new array with all these combined:
$mods = array();
$index = -1;
foreach($fields as $field) {
$index++;
$mods[$index]['name'] = $field['name'];
$mods[$index]['rating'] = $field['rating'];
}
Then I am grouping these so that all the ratings for the same name are together, so I can sum them later.
$groups = array();
foreach ($mods as $value) {
$groups[$value['name']][] = $value;
}
This produces the following:
Array (
[Clark Kent] => Array (
[0] => Array (
[name] => Clark Kent
[rating] => 5
)
[1] => Array (
[name] => Clark Kent
[rating] => 5
)
)
[Peter Parker] => Array (
[0] => Array (
[name] => Peter Parker
[rating] => 5
)
[1] => Array (
[name] => Peter Parker
[rating] => 5
)
)
[Bruce Wayne] => Array (
[0] => Array (
[name] => Bruce Wayne
[rating] => 5
)
[1] => Array (
[name] => Bruce Wayne
[rating] => 5
)
)
[Bruce Banner] => Array (
[0] => Array (
[name] => Bruce Banner
[rating] => 5
)
[1] => Array (
[name] => Bruce Banner
[rating] => 5
)
)
)
What I am trying to accomplish would be something like this:
<table>
<tr>
<td>Clark Kent</td>
<td>{average of all ratings}</td>
</tr>
</table>
I'm most of the way there, but I am stuck! I'm not sure how to get the grouped name that doesn't have any type of index or key so I can use that value for my table. Then I need to sum each grouped values.
I would do all the necessary math in the loop that reads the data from the database. Something like this:
$ratings = array();
while ($row = $result->fetch_assoc()) {
$name = $row['name'];
if (!isset($ratings[$name])) {
$ratings[$name] = array('count' => 1, 'sum' => $row['rating']);
}
else {
$ratings[$name]['count']++;
$ratings[$name]['sum'] += $row['rating'];
}
}
Then you can just output your table like so:
echo "<table>";
foreach ($ratings as $name => $r) {
echo "<tr><td>$name</td><td>" . round($r['sum'] / $r['count'], 1) . "</td></tr>";
}
echo "</table>";
To get average you can do something like:
foreach ($groups as $name => $group) {
$average = array_sum(array_column($group, 'rating')) / count($group);
echo $name;
}
You could simplify the problem in the first place in the structure you are using to handle those date
foreach($fields as $field) {
$mods[$field['name']][] = $field['rating'];
}
then just foreach with the key parameter
foreach($mods as $name => $mod) {
echo $name;
echo array_sum($mod) / count($mod);
}
Try to use the code below. Eliminating an extra loop to preparing group array.
$mods = array();
foreach($fields as $field) {
$mods[$field['name']][] = $field['rating'];
}
<table>
<tr>
<?php
if($mods) {
foreach($mods as $key=>$value) {
?>
<td><?php echo $key; ?></td>
<td><?php echo (array_sum($value)/count($value)); ?></td>
<?php
}
}
?>
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.
I have an array with fetched data from a database query:
Array
(
[0] => stdClass Object
(
[dataid] => 925977
[camp_id] => 2003001
[cid] =>
[userid] => ushio12
[ip_client] => 36.74.213.75
[register_time] => 2015-04-01 22:39:04
[country] => Indonesia
[game_name] => TOUCH
[server] => SALSA
[nominal] => Rp 100000
[logintime] => 2015-04-01 22:39:12
)
//...
[2] => stdClass Object
(
[dataid] => 929703
[camp_id] => 2003001
[cid] =>
[userid] => fiqri179
[ip_client] => 125.162.70.16
[register_time] => 2015-04-02 23:40:23
[country] => Indonesia
[game_name] => TOUCH
[server] => K-POP
[nominal] => Rp 100000
[logintime] => 2015-04-02 23:40:26
)
)
So far, based on the array result above, I fetch the data in view manually like this:
<tr>
<th>dataid</td>
<th>camp_id</td>
<th>cid</td>
<th>ip_client</td>
<th>register_time</td>
<th>country</td>
<th>game_name</th>
<th>server</th>
</tr>
<?php
if(isset($result))
{
foreach ($result as $row)
{
echo "<tr>";
echo "<td>".$row->dataid."</td>";
echo "<td>".$row->camp_id."</td>";
echo "<td>".$row->cid."</td>";
echo "<td>".$row->ip_client."</td>";
echo "<td>".$row->register_time."</td>";
echo "<td>".$row->country."</td>";
echo "<td>".$row->game_name."</td>";
echo "<td>".$row->server."</td>";
echo "</tr>";
}
}
?>
It is because I know what info the user will search.
However, this time, I don't know what the user will search (Which columns gets returned). They may search only some specific info or whole info, so that the array result will have less or other columns that this one now.
So my question is, how to automatically generate the view based on the keys (column names) array the user try to search, so that the <th>".$key."</th> will be dynamic?
This should work for you:
Here I just cast the first stdClass in the array with index 0 to an array, that then I can grab all keys with array_keys().
<?php
$columns = array_keys((array)$result[0]);
echo "<tr>";
foreach($columns as $column)
echo "<th>$column</th>";
echo "</tr>";
?>
EDIT:
With the rows you do the same like this:
foreach ($result as $row) {
echo "<tr>";
foreach($columns as $column)
echo "<td>" . $row->$column . "</td>";
echo "</tr>";
}
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