There is this table i want to load into a multi-dimensional array. The problem is that since the table has rowspan values each line may have different cell counts. So i have to remove rowspan and add null values instead of these cells.
This is the table i have(Original file)(Have like 5k rows.)
I have to add this table like this in order to have a proper array.
Removing colspan values for the first line was easy. But removing rowspans in current method sometimes cause extra values in array.
My current PHP file for this:
<?php
ini_set('display_errors', true);
ini_set('mbstring.internal_encoding','UTF-8');
ini_set("memory_limit", "1024M");
ini_set('max_execution_time', 300);
include('simple_html_dom.php');
// Create a DOM object
$html = new simple_html_dom();
$html->load_file('stok.html');
$table = array();
$kac = array();
foreach($html->find('tr') as $row) {
$satir = array();
$j = 0;
foreach($row->find('td') as $element) {
if($kac[$j]['deger']>0){
$satir[]='';
$kac[$j]['deger']=$kac[$j]['deger']-1;
$j++;
while($kac[$j]['deger']>0){
$satir[]='';
$kac[$j]['deger']=$kac[$j]['deger']-1;
$j++;
}
}else{
$j++;
if(isset($element->rowspan)){
$kac[$j]['deger']=($element->rowspan)-1;
}
$satir[] = str_replace(' ', '', strip_tags($element->innertext));
}
if(isset($element->colspan)){
$sayi=($element->colspan)-1;
for($i=1;$i<=$sayi;$i++){
$satir[] = '';
}
}
}
$table[] = $satir;
}
echo '<pre>';
print_r($table);
echo '</pre>';
?>
My Current Output Sample: (See some Array values has 21, 23 and 17 items in it. Correct one is 21 items. (20 as index value)) --Didn't remove the table values in example output--
Array
(
[0] => Array
(
)
[1] => Array
(
[0] => Envanter (R/B/K) (Filitre Kodu : sa) (Envanter Tarihi :28/11/2012 ) (Depo : 100)
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
[15] =>
[16] =>
[17] =>
[18] =>
[19] =>
[20] =>
)
[2] => Array
(
[0] => Model
[1] => Stok Adı
[2] => R
[3] => Renk Adı
[4] => B
[5] => B
[6] => B
[7] => B
[8] => B
[9] => B
[10] => B
[11] => B
[12] => B
[13] => B
[14] => B
[15] => B
[16] => B
[17] => B
[18] => B
[19] => Toplam
[20] => Resim
)
[3] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] => 34
[5] => 36
[6] => 38
[7] => 40
[8] => 42
[9] => 44
[10] => 46
[11] => 48
[12] => 50
[13] => 52
[14] => 54
[15] => 56
[16] => 58
[17] => 60
[18] => 62
[19] => Toplam
[20] =>
)
[4] => Array
(
[0] => 1K011621110
[1] => NIHAN 2111 KABAN
[2] => 064
[3] => FES
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] =>
[11] =>
[12] => 1.00
[13] =>
[14] =>
[15] =>
[16] =>
[17] =>
[18] =>
[19] => 1.00
[20] => Resim
)
[5] => Array
(
[0] =>
[1] =>
[2] => Toplam :
[3] =>
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] =>
[10] =>
[11] =>
[12] =>
[13] =>
[14] =>
[15] => 1.00
[16] =>
[17] =>
[18] =>
[19] =>
[20] =>
[21] =>
[22] => 1.00
[23] =>
)
[6] => Array
(
[0] =>
[1] => 34
[2] => 36
[3] => 38
[4] => 40
[5] => 42
[6] => 44
[7] => 46
[8] => 48
[9] => 50
[10] => 52
[11] => 54
[12] => 56
[13] => 58
[14] => 60
[15] => 62
[16] => Toplam
[17] =>
)
[7] => Array
(
[0] => 1K011624760
[1] => NIHAN 2476 KABAN
[2] => 001
[3] => SIYAH
[4] =>
[5] =>
[6] =>
[7] =>
[8] =>
[9] => 1.00
[10] =>
[11] => 1.00
[12] =>
[13] =>
[14] =>
[15] =>
[16] =>
[17] =>
[18] =>
[19] => 2.00
[20] => Resim
)
Thanks in advance.
UPDATE FOR SOLUTION WITH WORKING CODE: Currently fills all empty cells with "***"
<?php
ini_set('display_errors', true);
ini_set('mbstring.internal_encoding','UTF-8');
ini_set("memory_limit", "1024M");
ini_set('max_execution_time', 300);
include('simple_html_dom.php');
// Create a DOM object
$html = new simple_html_dom();
$html->load_file('stok.html');
$satir = array();
$rowcount = 0;
foreach($html->find('tr') as $row) {
$colcount = 0;
foreach($row->find('td') as $element) {
while($satir[$rowcount][$colcount]!=''){
$colcount++;
}
$satir[$rowcount][$colcount] = strip_tags(str_replace(' ', '***', $element->innertext));
if(isset($element->colspan)){
$sayi=($element->colspan)-1;
for($i=1;$i<=$sayi;$i++){
$satir[$rowcount][$colcount+$i] = '***';
}
}
if(isset($element->rowspan)){
$sayi=($element->rowspan)-1;
for($i=1;$i<=$sayi;$i++){
$satir[$rowcount+$i][$colcount] = '***';
}
}
$colcount++;
}
$rowcount++;
}
echo '<pre>';
print_r($satir);
echo '</pre>';
?>
In this tutorial, we will create a Delete Specific Row from Table using PHP. This code can delete specific data when the user clicks the delete button. The system uses the MySQLi DELETE query to delete particular data in the table row by providing an id in the WHERE clause. This a user-friendly program.
What does colspan= do? Allows a single table cell to span the width of more than one cell or column. What does rowspan= do? Allows a single table cell to span the height of more than one cell or row.
The DOM TableData rowSpan Property in HTML DOM is used to set or return the value of the rowspan attribute. The rowspan attribute in HTML specifies the number of rows a cell should span. It returns the rowSpan property. It is used to set the rowSpan property.
HTML tables can have cells that spans over multiple rows and/or columns. Note: The value of the colspan attribute represents the number of columns to span. Note: The value of the rowspan attribute represents the number of rows to span. Use the correct HTML attribute to make the first TH element span two columns.
Based on @deceze 's helpful comment, i used a different way to solve the issue. The code below will do the work. But it will fill all empty fields with ***
. You may need to re-visit whole array to empty it after. (The code for this is located below)
// Create a DOM object
$html = new simple_html_dom();
$html->load_file('stok.html');
$satir = array();
$rowcount = 0;
foreach($html->find('tr') as $row) {
$colcount = 0;
foreach($row->find('td') as $element) {
while($satir[$rowcount][$colcount]!=''){
$colcount++;
}
$satir[$rowcount][$colcount] = strip_tags(str_replace(' ', '***', $element->innertext));
if(isset($element->colspan)){
$sayi=($element->colspan)-1;
for($i=1;$i<=$sayi;$i++){
$satir[$rowcount][$colcount+$i] = '***';
}
}
if(isset($element->rowspan)){
$sayi=($element->rowspan)-1;
for($i=1;$i<=$sayi;$i++){
$satir[$rowcount+$i][$colcount] = '***';
}
}
$colcount++;
}
$rowcount++;
}
echo '<pre>';
print_r($satir);
echo '</pre>';
?>
The code block below will clear the array from those asterisks i mentioned above.
$itemcount=count($satir)-1;
for($i=1; $i<=$itemcount; $i++){
for($j=0; $j<=20; $j++){
if($satir[$i][$j]=='***'){
$satir[$i][$j]='';
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With