PHP-Loop repetition table using multidimensional array

Asked

Viewed 1,242 times

0

Hello, I need to make a table like the one in the image tabela exemplo 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 the foreach, but the concept is still new to me and I’m having a hard time understanding.

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

  • 1

    To mount the table by inverting the sort use the function to Array arsort

3 answers

1


A direct way to do this would be with 2 for one for each product and one for 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 required html as you navigate through the various elements.

An example of this construction would be 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>
  • Wow, now that I see you answered it, too. Your answer looked like mine, the only thing in her case, it’s not necessary to go with an accountant. Pq it is using numeral sequence in the array key, and the foreach already follows this sequence without having to count.

  • But it’s good she sees this method too, depending on the case she has in the future it can also be useful

  • @Fernandovr Yes I know, it was to show that can do both ways. Both gave with 2 for as with 2 foreach as interspersed as I did.

  • Ahh ok I understand your intention now ^^

  • @Fernandovr And maybe even in the first for is more intuitive to do by the indices since it is sequential numerical, although it is more direct with foreach as you did

  • It is true, I rarely use the for with arrays, already I am in the automatic doing everything direct by foreach. Everything is relative tbm neh, rsrs. I already use the for when I need two counts, and more complicated multidimensional arrays.

Show 1 more comment

1

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

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

Try it this way:

    <?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 ordering:

http://php.net/manual/en/array.sorting.php

As I don’t know the sort of sorting you want to do, I just put the link above. But you can ask another new ordering question later if you have any difficulties.

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 believe it becomes clearer how it works.

It will in each row create a td and then show the values, but if it is a array he will create a 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 implicitly do the same as the loop would.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.