Removing a key from a nested array in php - php

I am trying to display information taken from a mysql database but i do not want to display the 'id' field in the results. i got the displaying part down just fine. just need to remove a field from the view.
$plantarray = array();
if($result = $mysqli->query($hoyaquery)){
if(mysqli_num_rows($result) > 0){
while($row = mysqli_fetch_assoc($result)){
$plantarray[] = $row;
}
}
}
The code will return a nested array of results but it includes the tables id field.
its then displayed using:
<?php if (count($plantarray) > 0): ?>
<table>
<thead>
<tr>
<th><?php echo implode('</th><th>', array_keys(current($plantarray))); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($plantarray as $row): array_map('htmlentities', $row); ?>
<tr>
<td><?php echo implode('</td><td>', $row); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
ive tried to loop through the outside array and target the key 'id' but it doesnt do anything at all if i unset the id.
foreach($plantarray as $key){
unset($key['id']);
}
this does nothing at all.
i know the problem is in the looping, because if i set an array with the same data and i unset['id'] then it removes the id.
$p = [ "id" => 3, "Family" => "Apocynaceae", "Genus" => "Hoya", "Species" => "curt" ];
unset($p["id"]);
print_r($p);
i could have this completely wrong. I'm not sure. I'm unsure where its going wrong.

The reason that your loop doesn't work is because you aren't unsetting the values in the array itself, rather in the "copy" that is generated during the foreach loop. If you want to use this solution then the right code looks something like this:
foreach($plantarray as &$key){
unset($key['id']);
}
The & symbol will pass the row by reference which will make your manipulations be kept in the original array.
That said, this is not a performant way of doing this. Ostensibly, you have a query somewhere above this code that looks something like
$hoyaquery = "SELECT * FROM plant-table-name";
Instead, just don't get the id column from the database at all.
$hoyaquery = "SELECT Family, Genus, Species FROM plant-table-name"
That will prevent you from needing to loop through all your results in the first place.

Related

Data Tables second table is shown but no reaction

I have implemented a table from data tables
Link [https://datatables.net/]
i would like to use two tables in one site with different columns and datas in the columns after the mysqli connection i insert the data sets with a while mysqli fetch array function the first table works properly
"urlaubstage" -> is correct
but table 2
no matter what i do even var_dump i dint not get any reaction but the table is display correctly on the page but with empty columns
This is the html code
<table id="table_id" class="display">
<thead>
<tr>
<th>Urlaubstage Jahr</th>
<th>Urlaubstage Anspruch</th>
<th>Urlaubstage Beansprucht</th>
<th>Urlaubstage Rest</th>
</tr>
</thead>
<tbody>
<?php
while($row = mysqli_fetch_array($sql)){
$urlaubsTage = $row[4];
echo "<tr>";
echo "<td>{$urlaubsTage}</td>";
echo "<td>Anspruch</td>";
echo "<td>Beansprucht</td>";
echo "<td>Rest</td>";
echo "halllo";
}
echo "</tr>";
?>
</tbody>
</table>
!!!!!!!!!!!!<p>HERE STARTS THE SECOND TABLE</p>!!!!!!!!!!!!!!!!!!!!!!!!
<table id="table_id2" class="display">
<thead>
<tr>
<th>Urlaub Antragsdatum</th>
<th>Urlaub Startdatum</th>
<th>Urlaub Enddatum</th>
<th>Urlaubs Status</th>
</tr>
</thead>
<tbody>
<?php
while($row = mysqli_fetch_array($sql)){
var_dump($row); -> EVEn VAR_DUMP IS NOT SHOWN
echo "<tr>";
echo "<td>Antragsdatum</td>";
echo "<td>Startdatum</td>";
echo "<td>Enddatum</td>";
echo "<td>Status</td>";
echo "halllo";
}
echo "</tr>";
?>
</tbody>
</table>
JQUERY CODE
....
$('#table_id').DataTable();
//FUNKTION FÜR ZWEITE TABELLE
$('#table_id2').DataTable();
....
Picture of Code and Table
ok i got the answer by myself, after the first loop runs the query $sql with mysqli_fetch_array($sql) you cant use it anymore on the second loop why? cause it ran on the first loop and its over solution
rename;
$sql = mysqli_query(same query);
$sql2 = mysqli_query(same query);
first loop while($row = mysqli_fetch_array($sql);
second loop while($row = mysqli_fetch_array($sql2);
You don't need to execute the same query twice. You don't need the while loop either. Try to get the results into an array and then loop the array multiple times.
$result = $conn->query($sql)->fetch_all();
//...
foreach ($result as $row) {
//...
}
// Repeat the same loop again without calling query again
//foreach...

PHP How do you separate your results to echo in two divs of the one page?

I know how to produce results one after another but how do you separate them? So in my sql I'm selecting * from table and limiting it to 4
$sql = "SELECT * FROM table limit 4";
$result = $conn->query($sql);
while($row = $result->fetch_assoc())
{$rows['id']=$row;};
$price = $row['price'];
I dont seem to get any result, any suggestions, sorry guys beginner
...<?php echo $id ?></font></span>
<h4><?php echo $price ?></h4></div>
<div class="planFeatures"><ul>
<li><h1><?php echo $id=2 ?></h1></li>//how do I echo the next id?
<li><?php echo $price2 ?></li> //also the next price which id now is also 2
//and so on......
How do I display the next increments results in a different area of the same page, within another div?
I do get results if I sql and re-select all over again (and say id=2) but I'm sure there is a better way of doing it because I've already got my 4 results with my limit.
It seems you are not saving the results from the query result properly. Each iteration of the loop overwrites the same bucket in the $rows array. Instead, you need to add elements to the $rows array; this will produce an indexed array. Then you can iterate over it and generate the HTML content.
<?php
// Perform query.
$sql = "SELECT * FROM table limit 4";
$result = $conn->query($sql);
// Fetch results
while (true) {
$row = $result->fetch_assoc();
if (!$row) {
break;
}
$rows[] = $row;
}
// Generate HTML content using $rows array.
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row):?>
<tr>
<td>ID: <?php print $row['id'];?></td>
<td>Price: <?php print $row['price'];?></td>
</tr>
<?php endforeach;?>
</tbody>
</table>
I took some liberty in the above example and generated a simple HTML table. Of course you can modify this to generate whatever you want.
I hope I've interpreted your question accurately, apologies if not!

How do I set column names in dynamic tables?

I am retrieving a result from the database where the column names are script_id, script_name etc, now what I am doing is after fetching the results from the table say I fetched 2 columns, example script_id and script_name so am saving the names separated with a comma and using a loop, but what if I am not aware how many parameters the user has selected, and how many will it return? for example what am doing
<table>
<tr>
<?php
$columns = explode(',', $fetch_column_list);
foreach($columns as $throw_names) {
echo '<td>'.$throw_names.'</td>';
}
?>
</tr>
//And here I loop the results
</table>
But what If am having a form with different parameters to select
So here I cannot have a pre-defined list of my defined column names as user may or may not have seleted the column
So how I can generate the table dynamically with MY DEFINED COLUMN HEADERS on the front-end
You don't need to know how many columns you've got.
Instead of numbers you have to use field names
<?
$trans = array (
'script_name' => 'Fancy script name field header',
'script_value' => 'Fancy script value field header',
}
$data = $db->getAll("SELECT * FROM table");
$keys = array_keys($data[0]);
?>
<table>
<tr>
<? foreach ($keys as $k): ?>
<td><?=$trans[$k]?></td>
<? endforeach ?>
</tr>
<? foreach ($data as $row): ?>
<tr>
<? foreach ($row as $one): ?>
<td><?=$one?></td>
<? endforeach ?>
</tr>
<? endforeach ?>
</table>
How do you fetch your data?
If you use a function like mysqli_fetch_assoc, you may use
$row = mysqli_fetch_assoc( ... );
$columns = array_keys($row)

Foreach $item is not displaying

Having trouble using foreach to output the contents of a mysql table. The table (tr, td) etc is being printed out for each entry in the mysql table, but there is nothing between the td and /td tags, where each $item should be echoed.
$sql = 'SELECT domain FROM domainsuggestions';
$domains = mysqli_query($link, $sql); // get domain suggestions from table
<table>
<tr>
<td>Domain Suggestions</td>
</tr>
<?php foreach ($domains as $item): ?>
<tr>
<td><?php echo htmlspecialchars($item, ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<?php endforeach; ?>
</table>
Your logic for working with MySQL is quite off. You need to perform the query first, grab the resource ID of the results, and then loop through the results.
$sql = 'SELECT domain FROM domainsuggestions';
$results= mysqli_query($link, $sql); // get domain suggestions from table
<table>
<tr>
<td>Domain Suggestions</td>
</tr>
<?php while ($item = mysqli_fetch_assoc($results)): ?>
<tr>
<td><?php echo htmlspecialchars($item['domain '], ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<?php endwhile; ?>
</table>
foreach expects an iterable element, i.e. something that has many entries that it can iterate through. That's typically an array, but can also be an object that implements the Iterable interface.
What you get when running mysqli_query is a resource. That's just a handle on a MySQL result set. The data is not yet in PHP, MySQL just gave you a handle saying "okay, I got the results for you ready, come get them whenever you need to". Calling mysqli_fetch_assoc gets one result row from MySQL. Calling it again gets the next, and the next and so on. This is not a process you can iterate through, you can just keep calling mysqli_fetch_assoc until there are no more results.
That's why foreach does not work.

Looping with while and foreach in PHP

I cannot seem to get foreach to work. Maybe I do not understand it correctly.
Here is my code:
$statement = "SELECT * FROM categories ORDER BY name ASC";
$query = mysql_query($statement)
...
...
$cals = array("sports","general","other","clubs");
foreach ($cals as $value)
{
/* echo "<h3>".$value."</h3>";
*/ echo "<table width='100%'>";
while ($array = mysql_fetch_array($query))
{
if ($array['calendar'] == $value)
{?>
<tr>
<td><?php echo $array['name']; ?></td>
<td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
</tr>
<?php }
}
echo "</table><br />Value: $value";
}
The goal of this is to have the foreach change the if statement. I had planned for the if statement to say: if ($array['calendar'] == "sports") the first time, if ($array['calendar'] == "general") the second time, and so on. However, it shows all of the tables (in the source code), but no table rows are created after the first for each array value. For example, I correctly see the sports table, but I do not see any table rows for general, other, or clubs. There are records in that database that should appear in each of those. Could it be a problem with the while and if statements? If I manually set the $value in the if statement to one of the values in the array, it shows the correct records.
What am I missing?
Sample Data:
in the MySQL database -
categories table.
fields:
id
name
num_events
calendar
calendar_url
All of these fields except the calendar field has dummy data in it.
Currently, I have 5 records in there. Each one has a different calendar value. One is sports, one is clubs, and one is general. Depending on what value I place first in the array, it only shows that one table, of all of the values with whatever the first value in the array is.
Here is the source code from the resulting page:
<table width='100%'><tr>
<td>test4</td>
<td><a onclick="update_form('test4', 'sports')" href="#">Edit</a></td>
</tr>
<tr>
<td>test5</td>
<td><a onclick="update_form('test5', 'sports')" href="#">Edit</a></td>
</tr>
</table><br />Value: sports<table width='100%'></table><br />Value: general<table width='100%'></table><br />Value: other<table width='100%'></table><br />Value: clubs
As jcubic and timdev pointed out, there are a couple problems with the code as written. However, the algorithm you're trying to use is very inefficient because it loops over the entire result set for every calendar type. Instead, you can use a multi-column sort in SQL to do it in one pass:
$query = "SELECT * FROM categories ORDER BY calendar, name";
$results = mysql_query($results)
...
...
$last_cal = '';
while ($array = mysql_fetch_assoc($query))
{
if (!$last_cal) {
echo '<table>';
}
else if ($array['calendar'] != $last_cal) {
echo '</table>';
echo '<table>';
}
?>
....HTML for table row...
<?php
$last_cal = $array['calendar'];
}
First, just a point of style. You might consider renaming your variable $query to something like $results. It's holding the result of a query, not a query itself.
The problem is that you're not resetting $results. After the first table, you've iterated all the way through the array. When you get to the end, and there are no more rows to iterate over, mysql_fetch_assoc() returns false.
So try this:
foreach ($cals as $value)
{
while ($array = mysql_fetch_array($query))
{
if ($array['calendar'] == $value)
{
?>
<tr>
<td><?php echo $array['name']; ?></td>
<td><a onclick="update_form('<?php echo $array['name']; ?>', '<?php echo $array['calendar']; ?>')" href="#">Edit</a></td>
</tr>
<?php
}
}
echo "</table><br />Value: $value";
mysql_data_seek($query,0); // <=== Set the resultsets internal pointer back to zero (the first record).
}
The important bit is the mysql_data_seek() on the second to last line.
You could also stick that mysql_data_seek() right before the while() line, if you prefer. You just need to make sure that for each iteration of the foreach loop, the array pointer is reset before you hit while().
EDIT: s/reset/mysql_data_seek/
Try this instead...
$result = mysql_query($query);
while ($array = mysql_fetch_array($result)) {
...
}
mysql_fetch_array return array indexed by integer if you want asoc array change
while ($array = mysql_fetch_array($query))
to this
while ($array = mysql_fetch_assoc($query))

Categories