Split a string 2 times and put it in a table - php

Ok i have a string which needs to be splitted 2 times.
First time by whitespaces and second time by commas. So i can put it in a table.
I managed to split the string by whitespaces and put it in the first column of the table but i struggle to split it for the second time and put the values in the right column.
Here the snippets of what i already got:
<?php for ($i = 0; $i < sizeof($volumes); $i++) {
echo "<tr><td>" . $volumes[$i] . "</td></tr>";
} ?>

When you render the table rows you should split each volume by comma. I don't understand exactly all the retrieved rows or what is the logic behind your code but this bunch of code should do what you need:
<?php
for ($i = 0; $i < sizeof($volumes); $i++) {
echo '<tr>';
$volumeData = explode(',', $volumes[$i]);
foreach ($volumeData as $volume) {
echo '<td>' . $volume . '</td>';
}
echo '</tr>';
}
?>

Are you sure the string you provided is accurate? I think there's a coma missing between the size of SystemReserved and the label of the next drive. If that's the case - the code should be something like this:
First we 'explode' the string to create an array, then use array chunk to split it into arrays with seven entries each. And then render it:
$string = 'L,Logs,NTFS,Healthy,OK,9.73,9.77 ,SystemReserved,NTFS,Healthy,OK,0.16,0.49 ,C,LocalDisk,NTFS,Healthy,OK,18.19,29.74';
$array = explode(',', $string);
$results = array_chunk($array, 7, true);
?>
<table id="tbl_basic_volumes">
<tr>
<th>Buchstabe:</th>
<th>Name:</th>
<th>Filesystem:</th>
<th>Health Status:</th>
<th>Operational Status:</th>
<th>Freier Speicherplatz:</th>
<th>Gesamter Speicherplatz:</th>
</tr>
<?php
foreach ($results as $result) {
echo '<tr>';
foreach ($result as $entry) {
echo '<td>'.$entry.'</td>';
}
echo '</tr>';
}
?>
</table>

You can escape the inner foreach loop using implode.
$str = "L,Logs,NTFS,Healthy,OK,9.73,9.77 ,SystemReserved,NTFS,Healthy,OK,0.16,0.49 C,LocalDisk,NTFS,Healthy,OK,18.19,29.74";
$rows = explode(' ', $str);
foreach ($rows as $row) {
echo '<tr><td>' . implode('</td><td>', explode(',', $row)) . '</td></tr>';
}
Or even replacing commas with </td><td> will also work:
$str = "L,Logs,NTFS,Healthy,OK,9.73,9.77 ,SystemReserved,NTFS,Healthy,OK,0.16,0.49 C,LocalDisk,NTFS,Healthy,OK,18.19,29.74";
$rows = explode(' ', $str);
foreach ($rows as $row) {
echo '<tr><td>' . str_replace(',', '</td><td>', $row) . '</td></tr>';
}

Related

read row and columns of text file in php

I have a text file the contents of which are as follows:
120MB 130MB 140MB 140MB
10% 20% 30% 40%
I have a php code which reads the file and prints the column.
<?php
$lines = file('test_ssh.txt');
foreach ($lines as $line) {
$parts = explode(' ', $line);
echo $parts[2] ;
}
?>
by this code I can read columns from the first row as and when required(i.e, if I need to popultae 1st column from 1st row in html table, I can do so by $parts[0])
but I am not able to read second line column by column(i.e. if I just need to read 1st column from 2nd row), I am not able to do it, I just get blank value.
Do I need some 2-D array to read lines and column separately or there is another easier way ? Please help with your expertise.
Not sure why you would only want to print one item from the first line and all the occurances from the second. But if this was really what you were asking how to do here is one way.
<?php
$lines = file('test_ssh.txt');
foreach ($lines as $lineNo => $line) {
$parts = explode(' ', $line);
if ( $lineNo < 1 ) {
echo $parts[2] . PHP_EOL;
} else {
foreach( $parts as $col ) {
echo $col . ' ';
}
}
}
Result
140MB
10% 20% 30% 40%
After your comment below
Is this what you wanted
$lines = file('test_ssh.txt');
foreach ($lines as $line) {
if ( $line == PHP_EOL ) { continue; } // avoid blank lines causing issues
$columns = explode(' ', $line);
echo '<tr>' . PHP_EOL;
foreach( $columns as $col ) {
echo '<td>' . trim($col) . '</td>';
}
echo PHP_EOL . '</tr>' . PHP_EOL;
}
RESULT
<tr>
<td>120MB</td><td>130MB</td><td>140MB</td><td>140MB</td>
</tr>
<tr>
<td>10%</td><td>20%</td><td>30%</td><td>40%</td>
</tr>
<tr>
<td></td>
</tr>
ignore the PHP_EOL in the table output, they are there just to make the output look human readable.
Having reread the updated question, maybe this is what you want
function getColfromBothLines($col, $lines)
{
$lin1 = explode(' ', $lines[0]);
$lin2 = explode(' ', $lines[1]);
return $lin1[$col] . ' - ' . $lin2[$col];
}
$lines = file('test_ssh.txt');
echo getColfromBothLines(0, $lines).PHP_EOL;
echo getColfromBothLines(1, $lines).PHP_EOL;
echo getColfromBothLines(2, $lines).PHP_EOL;
RESULT
120MB - 10%
130MB - 20%
140MB - 30%
Try this! First foreach for lines and second for explodes.
<?php
$lines = file('test_ssh.txt');
foreach ($lines as $line) {
$parts = explode(' ', $line);
foreach ($parts as $part) {
echo $part;
}
}
Do not close php tag :)
Try this.
$array = explode("\n", file_get_contents('file.txt'));

Convert array to another array

I have one array that I am showing like this:
echo '<table>';
foreach ($rowData as $row => $tr) {
echo '<tr>';
foreach ($tr as $td)
echo '<td>' . $td .'</td>';
echo '</tr>';
}
echo '</table>';
The second and fourth columns are always the name of the column. The result is something like:
Name: John Locke - NickName: Locke
Age: 20 - Adress: Ok
See the pattern?
How can I put these array in my database?
As my database table structure is:
ID - Name - NickName - Age - Adress
I don't have a clue how to do that with the array i'm using..
--UPDATE
$table = $html->find('table', 0);
$rowData = array();
foreach($table->find('tr') as $row) {
// initialize array to store the cell data from each row
$flight = array();
foreach($row->find('td') as $cell) {
foreach($cell->find('span') as $e){
$e->innertext = '';
}
// push the cell's text to the array
$flight[] = $cell->plaintext;
}
$rowData[] = $flight;
}
echo '<table>';
foreach ($rowData as $row => $tr) {
echo '<tr>';
echo '<td>' . $row . '</td>';
foreach ($tr as $td)
echo '<td>' . $td .'</td>';
echo '</tr>';
}
echo '</table>';
you can do that:
$insert = "";
foreach ($rowData as $row => $tr) {
$insert .= "('".$tr[0]."','".$tr[0]."','".$tr[0]."','".$tr[0]."'),";
}
$insert = substr($insert, 0, -1)
$sql = "Insert into YourTable values ".$insert;
As you already know what the array positions relate to, IE positions 0 through 3. You can simply iterate as you are doing now and compile a query instead.
Just drop this snippet into your code, ive knocked this up on the fly and its a bit hackish, probably a better way. Just look at what it does on your screen and see where if any it needs correcting.
$insert = '';
for ($i=0; $i<=3; $i++):
$insert .= "'" . $tr[$i] . "'";
if ($i !== 3):
$insert .= ',';
endif;
endfor;
echo $insert;
Once you are seeing what looks like a correct insert then you can (using safe methods) insert it into your database.

Excluding numbers from an array

The code below returns a table with a row for every word or number that appears in $commentstring. Each word or number appears as $word in the table below. How can I exclude numbers?
$words = explode(" ", $commentstring);
$result = array_combine($words, array_fill(0, count($words), 0));
arsort($words);
foreach($words as $word) {
$result[$word]++;
arsort($result);
}
echo "<table>";
foreach($result as $word => $count1) {
echo '<tr>';
echo '<td>';
echo "$word";
echo '</td>';
echo '<td>';
echo "$count1 ";
echo '</td>';
echo '</tr>';
}
echo "</table>";
You could use is_numeric to check whether each $word is a number, and only insert it into your array if it isn't.
if (!is_numeric($word)) {
if (!isset($result[$word]))
$result[$word] = 0;
$result[$word]++;
arsort($result);
}
Edit: Also, do you really need to sort the array on each increment? Why not just sort it at the end?
If i'm understanding your question right you can check if the $word var is a number by using the is_numeric() function
foreach($result as $word => $count1) {
if(is_numeric($word)) { continue; }
...

Create a comma-separated string from a single column of an array of objects

I'm using a foreach loop to echo out some values from my database, I need to strip the last comma from the last loop if that makes sense.
My loop is just simple, as below
foreach($results as $result){
echo $result->name.',';
}
Which echos out
result,result,result,result,
I just need to kill that pesky last comma.
Better:
$resultstr = array();
foreach ($results as $result) {
$resultstr[] = $result->name;
}
echo implode(",",$resultstr);
1. Concat to string but add | before
$s = '';
foreach ($results as $result) {
if ($s) $s .= '|';
$s .= $result->name;
}
echo $s;
2. Echo | only if not last item
$s = '';
$n = count($results);
foreach ($results as $i => $result) {
$s .= $result->name;
if (($i+1) != $n) $s .= '|';
}
echo $s;
3. Load to array and then implode
$s = array();
foreach ($results as $result) {
$s[] = $result->name;
}
echo implode('|', $s);
4. Concat to string then cut last | (or rtrim it)
$s = '';
foreach ($results as $result) {
$s .= $result->name . '|';
}
echo substr($s, 0, -1); # or # echo rtrim($s, '|');
5. Concat string using array_map()
echo implode('|', array_map(function($result) { return $result->name; }, $results));
$result_names = '';
foreach($results as $result){
$result_names .= $result->name.',';
}
echo rtrim($result_names, ',');
I've been having the same issue with this similar problem recently. I fixed it by using an increment variable $i, initializing it to 0, then having it increment inside the foreach loop. Within that loop place an if, else, with the echo statement including a comma if the $i counter is less than the sizeof() operator of your array/variable.
I don't know if this would fix your issue per se, but it helped me with mine. I realize this question is years-old, but hopefully this will help someone else. I'm fairly new to PHP so I didn't quite understand a lot of the Answers that were given before me, though they were quite insightful, particularly the implode one.
$i=0;
foreach ($results as $result) {
$i++;
if(sizeof($results) > $i) {
echo $result . ", ";
} else {
echo $result;
}
}
In modern PHP, array_column() will allow you to isolate a column of data within an array of objects.
Code: (Demo)
$results = [
(object)['name' => 'A'],
(object)['name' => 'B'],
(object)['name' => 'C']
];
echo implode(',', array_column($results, 'name'));
Output:
A,B,C
That said, since you are iterating a result set, then you may be better served by calling a CONCAT() function in your sql, so that the values are already joined in the single value result set.
If you are processing a collection in Laravel, you can pluck() and implode():
$collection->pluck('name')->implode(',')
$arraySize = count($results);
for($i=0; $i<$arraySize; $i++)
{
$comma = ($i<$arraySize) ? ", " : "";
echo $results[$i]->name.$comma;
}
Not as pretty, but also works:
$first=true;
foreach($results as $result){
if(!$first) { echo ', '; }
$first=false;
echo $result->name;
}
Another smart way is:
foreach($results as $result){
echo ($passed ? ',' : '') . $result->name;
$passed = true;
}
In this case at first loop $passed is NULL and , doesn't print.
I know this is an old thread, but this came up recently and I thought I'd share my alternate, cleaner way of dealing with it, using next().
$array = array("A thing", "A whatsit", "eighty flange oscillators");
foreach( $array as $value ){
echo $value;
$nxt = next($array);
if($nxt) echo ", "; // commas between each item in the list
else echo ". And that's it."; // no comma after the last item.
}
// outputs:
// A thing, A whatsit, eighty flange oscillators. And that's it.
play with it here
I have to do this alot because I'm always trying to feed numbers in to jplot, I find its easier to put the comma in the front of the loop like so:
foreach($arrayitem as $k){ $string = $string.",".$k;
}
and then chop off the first character (the comma) using substr, it helps if you know a guestimate of long your string will be, I'm not sure what the limit on substr max character is.
echo substr($a,1,10000000);
hope this helps.
$a[0] = 'John Doe';
$a[1] = 'Jason statham';
$a[2] = 'Thomas Anderson';
$size = count($a);
foreach($a as $key=>$name){
$result .= $name;
if($size > $key+1) $result .=', ';
}
echo $result;
<?php
$return = array(any array)
$len = count($return);
$str = '';
$i = 1;
foreach($return as $key=>$value)
{
$str .= '<a href='.$value['cat_url'].'>'.$value['cat_title'].'</a>';
if($len > $i)
{
$str .= ',';
$i = $i+1;
}
}
echo $str;
?>
<?php
$i = 1;
$count = count( $results );
foreach( $results as $result ) {
echo $result->name;
if ( $i < $count ) echo ", ";
++$i;
}
?>
This is what I normally do, add a comma before the item rather than after, while ignoring the first loop.
$i = 0;
$string = '';
foreach($array as $item){
$string .= ($i++ ? ',' : '').$item;
}
First get all the output by using output buffering. Then, trim the comma and display it. So, do it like this:
ob_start();
foreach($results as $result)
{
echo $result->name.',';
}
$output = ob_get_clean();
echo rtrim($output, ',');
The output buffering method helps if the inside loop is very big (and OP is posting here just for brevity), then using OB is easier without changing the internals of the loop.

PHP loop, change last item?

This might actually be a css question but I'm hoping not because I'd like this to work in IE.
I have the following loop:
<?php
if ($category)
{
foreach($category as $item)
{
echo $item['name'];
echo ", ";
}
} ?>
Which should output
item, item, item, item,
The only thing is...I'd like to NOT have a comma after the last item. Is there any way to do this within a loop?
Well to keep your code how it is, you could add a counter, and skip the last one.
<?php
if ($category) {
$counter = 0;
foreach($category as $item)
{
$counter++;
echo $item['name'];
if ($counter < count($category)) {
echo ", ";
}
}
}
?>
Or you can do it much, much, quicker:
<?php echo implode(", ", array_map(create_function('$item', 'return $item["name"];'), $category)); ?>
Don't echo immediately but save your output into a variable that you can trim.
<?php
if ($category) {
$output = '';
foreach($category as $item) {
$output .= $item['name'];
$output .= ", ";
}
echo rtrim($output, ', ');
}
?>
The implode solution is the simplest, but you asked for a loop. This method avoids putting an extra conditional in the loop, and therefore should be somewhat more efficient. Basically, instead of doing something different for the last item, you do something different for the first item.
$myArray = array(); //Fill with whatever
$result = $myArray[0];
for ($idx = 1; $idx < count($myArray); $idx += 1)
{
$result .= ', ' . $myArray[$idx];
}
EDIT: After realizing you want $item['name'] instead of just $item:
$myArray = array(); //Fill with whatever
$result = $myArray[0]['name'];
for ($idx = 1; $idx < count($myArray); $idx += 1)
{
$result .= ', ' . $myArray[$idx]['name'];
}
As lovely as foreach is,...
<?php
if ($category) {
$count = count($category) - 1;
for ($i = 0; $i <= $count; $i++) {
echo $category[$i]['name'];
if ($i < $count)
echo ', ';
}
}
?>
...for is sometimes necessary.
Assuming $category is an array, you can use implode to get what you want:
Edit: Missed the $categories['name'] part, this should work:
<?php implode(", ", array_keys($category, 'name')); ?>
The standard solution to the "last comma" problem is to put items into an array and then implode it:
$temp = array();
foreach($category as $item)
$temp[] = $item['name'];
echo implode(', ', $temp);
If you want this more generic, you can also write a function that picks ("plucks") a specific field out of each subarray:
function array_pluck($ary, $key) {
$r = array();
foreach($ary as $item)
$r[] = $item[$key];
return $r;
}
and then just
echo implode(', ', array_pluck($category, 'name'));
Or you could check for the last key:
end($category);
$lastkey = key($category);
foreach ( $category AS $key => $item ) {
echo $item['name'];
if ( $lastkey != $key ) {
echo ', ';
}
}
And another option:
<?php
$out = "";
foreach ($category as $item)
{
$out .= $item['name']. ", ";
}
$out = preg_replace("/(.*), $/", "$1", $out);
echo $out;
?>

Categories