PHP- Table with repetitions in loops using multidimensional array

0

Hello, I need to make a table like the but using this array:

$teste = array();
$teste[0]['produtos']['nome'] = "Produto 1";
$teste[0]['produtos']['descricao'] = "Descrição do produto 1";
$teste[0]['produtos']['valor'] = 50;
$teste[0]['produtos']['opcionais'][] = "Opcional 1";
$teste[0]['produtos']['opcionais'][] = "Opcional 2";
$teste[0]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['nome'] = "Produto 2";
$teste[1]['produtos']['descricao'] = "Descrição do produto 2";
$teste[1]['produtos']['valor'] = 75;
$teste[1]['produtos']['opcionais'][] = "Opcional 1";
$teste[1]['produtos']['opcionais'][] = "Opcional 2";
$teste[1]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['opcionais'][] = "Opcional 4";
$teste[2]['produtos']['nome'] = "Produto 3";
$teste[2]['produtos']['descricao'] = "Descrição do produto 3";
$teste[2]['produtos']['valor'] = 100;
$teste[2]['produtos']['opcionais'][] = "Opcional 1";
$teste[2]['produtos']['opcionais'][] = "Opcional 2";

Does anyone have any idea how I can do this? I'm trying to use foreach , but the concept is still new to me and I'm having trouble understanding.

And after doing this I still have to mount the same table, but reversing the ordering using a PHP sort function.

    
asked by anonymous 04.10.2017 / 03:15

3 answers

1

A direct way to do this would be with 2 for a for each product and another for the options.

Something like:

//neste for percorre os produtos, e utiliza count para saber quantos tem
for ($i = 0; $i < count($teste); ++$i){ 
    //usar o $teste[$i]['produtos']['nome'];
    //usar a $teste[$i]['produtos']['descricao'];
    //usar o $teste[$i]['produtos']['valor'];

    //foreach aqui percorre as várias opções
    foreach ($teste[$i]['produtos']['opcionais'] as $opcoes){
        //usar o $opcoes
    }
}

Now just build the necessary html as you navigate through the various elements.

An example of this would look like this:

<?php

$teste = array();
$teste[0]['produtos']['nome'] = "Produto 1";
$teste[0]['produtos']['descricao'] = "Descrição do produto 1";
$teste[0]['produtos']['valor'] = 50;
$teste[0]['produtos']['opcionais'][] = "Opcional 1";
$teste[0]['produtos']['opcionais'][] = "Opcional 2";
$teste[0]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['nome'] = "Produto 2";
$teste[1]['produtos']['descricao'] = "Descrição do produto 2";
$teste[1]['produtos']['valor'] = 75;
$teste[1]['produtos']['opcionais'][] = "Opcional 1";
$teste[1]['produtos']['opcionais'][] = "Opcional 2";
$teste[1]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['opcionais'][] = "Opcional 4";
$teste[2]['produtos']['nome'] = "Produto 3";
$teste[2]['produtos']['descricao'] = "Descrição do produto 3";
$teste[2]['produtos']['valor'] = 100;
$teste[2]['produtos']['opcionais'][] = "Opcional 1";
$teste[2]['produtos']['opcionais'][] = "Opcional 2";

?>

<table border="1">
    <tr>
        <th>Produto</th>
        <th>Descrição</th>
        <th>Valor</th>
        <th>Opções</th>
    </tr>
<?php

for ($i = 0; $i < count($teste); ++$i){
    echo "<tr><td>" . $teste[$i]['produtos']['nome'] . "</td>";
    echo "<td>" . $teste[$i]['produtos']['descricao'] . "</td>";
    echo "<td>" . $teste[$i]['produtos']['valor'] . "</td>";

    echo "<td>";
    //opções
    foreach ($teste[$i]['produtos']['opcionais'] as $opcoes){
        echo "$opcoes<br/>";
    }

    echo "</td></tr>";
}

?>
</table>
    
04.10.2017 / 03:34
1

You do not need to start an empty array in this case when you start an array using brackets, PHP already understands that it is an array, so you can ignore the $teste = array(); line.

You can use one foreach inside the other. one to list the first layer, and another to list the second layer with options.

Try this:

    <?php
        $teste[0]['produtos']['nome'] = "Produto 1";
        $teste[0]['produtos']['descricao'] = "Descrição do produto 1";
        $teste[0]['produtos']['valor'] = 50;
        $teste[0]['produtos']['opcionais'][] = "Opcional 1";
        $teste[0]['produtos']['opcionais'][] = "Opcional 2";
        $teste[0]['produtos']['opcionais'][] = "Opcional 3";
        $teste[1]['produtos']['nome'] = "Produto 2";
        $teste[1]['produtos']['descricao'] = "Descrição do produto 2";
        $teste[1]['produtos']['valor'] = 75;
        $teste[1]['produtos']['opcionais'][] = "Opcional 1";
        $teste[1]['produtos']['opcionais'][] = "Opcional 2";
        $teste[1]['produtos']['opcionais'][] = "Opcional 3";
        $teste[1]['produtos']['opcionais'][] = "Opcional 4";
        $teste[2]['produtos']['nome'] = "Produto 3";
        $teste[2]['produtos']['descricao'] = "Descrição do produto 3";
        $teste[2]['produtos']['valor'] = 100;
        $teste[2]['produtos']['opcionais'][] = "Opcional 1";
        $teste[2]['produtos']['opcionais'][] = "Opcional 2";


        echo '<table border="1">';
        echo '<tr><th>Nome</th><th>Descrição</th><th>Valor</th><th>Opcionais</th></tr>';

        foreach($teste as $val) {
            echo '<tr>';
            echo "<td valign=\"top\">{$val['produtos']['nome']}</td>";
            echo "<td valign=\"top\">{$val['produtos']['descricao']}</td>";
            echo "<td valign=\"top\">{$val['produtos']['valor']}</td>";
            echo "<td>";

               foreach($val['produtos']['opcionais'] as $itemopcional) {
                   echo "- {$itemopcional}</br>";
               }

            echo "</td>";
            echo '</tr>';
        }

        echo '</table>';
 ?>

And for sorting you can check the php documentation for Array sorts:

link

As I do not know what kind of ordering you want to do, then just put the link above. But you can then do another new sort order if you have any difficulty.

    
04.10.2017 / 03:47
0

You can detect if it is an array and change its behavior, basically this way:

<table style="width:100%">
<?php
foreach($teste as $linha){
    echo '<tr>';

    foreach($linha['produtos'] as $coluna){        
        echo '<td>';

        if(is_array($coluna)){            
            foreach($coluna as $valor){
                echo '<li>';
                echo $valor;
                echo '</li>';
            }            
        }else{        
            echo $coluna;
        }

        echo '</td>';        
    }  

    echo '</tr>';
}
?>
</table>

Of course there are other ways to do it, but so I think it's clearer how it works.

It will in each line create a td and then show the values, however if it is a array it will create li for each one. If you want a more compact version you could use:

<?php
$teste = array();
$teste[0]['produtos']['nome'] = "Produto 1";
$teste[0]['produtos']['descricao'] = "Descrição do produto 1";
$teste[0]['produtos']['valor'] = 50;
$teste[0]['produtos']['opcionais'][] = "Opcional 1";
$teste[0]['produtos']['opcionais'][] = "Opcional 2";
$teste[0]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['nome'] = "Produto 2";
$teste[1]['produtos']['descricao'] = "Descrição do produto 2";
$teste[1]['produtos']['valor'] = 75;
$teste[1]['produtos']['opcionais'][] = "Opcional 1";
$teste[1]['produtos']['opcionais'][] = "Opcional 2";
$teste[1]['produtos']['opcionais'][] = "Opcional 3";
$teste[1]['produtos']['opcionais'][] = "Opcional 4";
$teste[2]['produtos']['nome'] = "Produto 3";
$teste[2]['produtos']['descricao'] = "Descrição do produto 3";
$teste[2]['produtos']['valor'] = 100;
$teste[2]['produtos']['opcionais'][] = "Opcional 1";
$teste[2]['produtos']['opcionais'][] = "Opcional 2";
?>
<table style="width:100%">
<?php
foreach($teste as $linha){
    echo '<tr>';

    foreach($linha['produtos'] as $valor){       
        if(is_array($valor)){            
            $valor = '<li>'.implode($valor, '</li><li>').'</li>';
        }

        echo '<td>' . $valor . '</td>';
    }  

    echo '</tr>';
}
?>
</table>

The implode will do implicitly the same as the loop would do.

    
04.10.2017 / 03:55