Распечатать таблицу из массива в php - PullRequest
1 голос
/ 29 мая 2020

У меня есть массив в следующем формате:

Array
(
    [0] => Array
        (
            [Push to Web] => Yes
            [attribute_set] => laminate_flooring
            [category] => Accessories/Underlay
            [name] => Under Pad Feather Light Foam
            [sku] => 123-1028
            [description] => Floor Underlayment Feather Light (Vapour Barrier) 200 Sqft/Roll
            [short_description] => Floor Underlayment Feather Light (Vapour Barrier) 200 Sqft/Roll
            [image] => 123-1028.jpg
            [gallery_Image] => 9095307460638-424-424.jpg
            [price] => 0.24
            [qty_ca] => 16
            [weight] => 3
            [meta_description] => 51-1001
            [meta_title] => Under Pad Feather Light Foam
            [status] => 1
            [flooring_coverage] => 200
            [is_flooring_product] => 1
            [web_price_comparative] => 0.31
        )

    [1] => Array
        (
            [Push to Web] => Yes
            [category] => Accessories
            [name] => Vent Maple Flush 4x10
            [sku] => 089-1000
            [description] => Vent Flush Mount Maple 4 x 10
            [short_description] => Vent Flush Mount Maple 4 x 10
            [image] => 089-1000.jpg
            [price] => 17.05
            [qty_ca] => 63
            [qty_us] => 41
            [meta_description] => 10-1023
            [meta_title] => Vent Maple Flush 4x10
            [status] => 1
            [flooring_coverage] => 1
            [min_order_qty] => 400
            [web_price_comparative] => 22.16
        )
)

Мне нужно распечатать данные в таблице, чтобы каждый ключ массива печатался как заголовок столбца, а значение - как данные столбца. Это означает, что Pu sh to Web, attribute_set et c будет заголовком, а Yes, Luminate_flooring будет данными соответственно.

Я написал следующее, но оно не работает.

$table  = '<table border="1" id="datatable">
<tr>';
foreach($data as $key=>$value){
    $table .= '<td>'.$key.'</td>';
}
$table .= '</tr>';
foreach($data as $value){
    $table .=   '<tr>';
    foreach($value as $innerkey=>$innervalue){
                $table .=   '<td>'.$innervalue.'</td>';
             }
             $table .= '</tr>';
        }
    }
 }
 $table .= '</table>';

 print_r($table);

Помогите, пожалуйста, разобраться в проблеме. Заранее спасибо

1 Ответ

1 голос
/ 30 мая 2020

Вы говорите, что получаете 0,1,2 в ключах заголовка .. et c ....

foreach($data as $key=>$value){
    $table .= '<td>'.$key.'</td>';
}

Это потому, что ваши ключи верхнего уровня:

0
1
2
3..

На следующем уровне у вас есть эти ключи:

Push to Web
Category
Name
etc..

В этом фрагменте кода вы добавляете innervalue -data ( pu sh к веб-значению, значению категории, имя-значение et c ...) ...

foreach($data as $value){
    $table .=   '<tr>';
    foreach($value as $innerkey=>$innervalue){
        $table .= '<td>'.$innervalue.'</td>';
    }
    $table .= '</tr>';
}

... эти значения находятся на том же уровне, что и нужный вам ключ. Следовательно, $innerkey - это ключ, который вы хотите добавить в заголовок :

foreach($data as $value){
    $table .= '<tr>';
    foreach($value as $innerkey=>$innervalue){
        $table .= '<td>'.$innerkey.'</td>';
    }
    $table .= '</tr>';
}

Таким образом, logi c в основном выглядит примерно так:

$table  = '<table border="1" id="datatable">';
foreach($data as $key=>$value){
    $table .= '<tr>';
    foreach($value as $innerkey=>$innervalue){
        $table .= '<td>'.$innerkey.'</td>';
    }
    $table .= '</tr>';
}
foreach($data as $value){
    $table .= '<tr>';
    foreach($value as $innerkey=>$innervalue){
        $table .= '<td>'.$innervalue.'</td>';
    }
    $table .= '</tr>';
}
$table .= '</table>';

Основываясь на вышеупомянутом логе c - вы можете сделать это, чтобы достичь того, чего хотите:

ОБНОВЛЕНИЕ

Теперь, когда я понимаю, что все ключи не существуют в все элементы. Вы можете сделать так:

//Because you have different keys in different item
//you could recreate each item in the array
//Based on the the $use_keys array here 
//(add all keys you want to use and $use_keys set the order of the keys in 
//each item!)
$use_keys = ['pushweb', 'attribute set', 'category', 'name'];

//Go through the whole array and recreate it with keys given
//in $use_keys
foreach($data as $key=>$value){ 

    //Create a new array with key values from array $use_keys
    $new_arr = [];
    foreach($use_keys as $apk_item) {
        //Add key/value to the new array. If value already exist
        //in the $data[key] then use that value, else just empty string
        $new_value = '';
        if (isset($data[$key][$apk_item])) {
            $new_value = $data[$key][$apk_item];
        }            
        $new_arr[$apk_item] = $new_value;                
    }
    //Recreate the data[key] part of the original data array
    $data[$key] = $new_arr;
}

//Then same code as before
$row = 0;
$table  = '<table border="1" id="datatable">';
foreach($data as $value){
    $table .= '<tr>';
    if ($row == 0) {
        foreach($value as $innerkey=>$innervalue){
            $table .= '<td>'.$innerkey.'</td>';
        }    
    }
    $table .= '</tr><tr>';
    foreach($value as $innerkey=>$innervalue){
        $table .= '<td>'.$innervalue.'</td>';
    }
    $table .= '</tr>';
    $row++;
}
$table .= '</table>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...