Generate random number for an array

4

I have a foreach that fetches the data from one table and makes a insert in another table. I need to count the number of foreach registers, and then generate a random sequence, and feed a insert field.

See the code:

$dados2 = connection::select('SELECT * FROM tab1');
foreach ($dados2 as $reg) {   
    $campo1 = $reg['campo1'];
    $campo2 = $reg['campo2'];    
    $sequencia_aleatoria = '';                     
}
connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");

I hope you have understood my question.

    
asked by anonymous 18.10.2016 / 14:24

2 answers

2

Another option is to use mt_rand to generate a random value and count to return the total elements of array :

$dados2 = connection::select('SELECT * FROM tab1');

foreach ($dados2 as $reg) {   
    $campo1 = $reg['campo1'];
    $campo2 = $reg['campo2'];  

    $sequencia_aleatoria = mt_rand(0, count($dados2);  

    // Para inserir os dados de acordo com a linha atual
    connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");                    
}

Note : A second option might be the mysqli_num_rows , to get the number of rows resulting from select , this way you would not need count($dados2) .

Still, there is the possibility of generating repeated numbers.

Another way would be to generate a array with a number range with range and use shuffle to merge the elements.

Something like this:

$dados2 = connection::select('SELECT * FROM tab1');
$linhas = $dados2->fetchAll();

$numeros = range(1, count($linhas));

shuffle($numeros); // Mistura os elementos

foreach ($linhas as $i => $linha) { 
    $campo1 = $linha['campo1'];
    $campo2 = $linha['campo2'];  

    $sequencia_aleatoria = $numeros[$i];

    // Para inserir os dados de acordo com a linha atual
    connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");                    
}
    
18.10.2016 / 15:18
3

uses the uniqueid function of PHP, something like:

$dados2 = connection::select('SELECT * FROM tab1');
$contagem=0;

foreach ($dados2 as $reg) {   
    $campo1 = $reg['campo1'];
    $campo2 = $reg['campo2'];    
    $contagem++;                  
}

$sequencia_aleatoria=rand(0,$contagem);
connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");

The function uniqid() generates a hash based on the milliseconds so there is no possibility of repetition

I think your code would look like this:

$dados2 = connection::select('SELECT * FROM tab1');
$numero=count(dados2);

foreach ($dados2 as $reg) {   
    $campo1 = $reg['campo1'];
    $campo2 = $reg['campo2'];    
    $sequencia_aleatoria=rand(0,$numero);

    connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");   
    unset($sequencia_aleatoria);    
}

Turn this on!

<?php
$contagem=420; // aqui iioria o count($resultado);
for($i=0;$i<=$contagem;$i++){
    echo rand(0,$contagem)."<br>";
}
?>

the logic is the same and it is rolling.

Test online here link

instead of doing a foreach make a for

$dados2 = connection::select('SELECT * FROM tab1');
$numero=count(dados2);

for($i=0;$i<$numero;i++) { 
    $reg=$dados2[$i];  
    $campo1 = $reg['campo1'];
    $campo2 = $reg['campo2'];    
    $sequencia_aleatoria=rand(0,$numero);

    connection::exec("insert into tab2(campo1,campo2,sequencia_aleatoria) values('$campo1','$campo2','$sequencia_aleatoria')");   
    unset($sequencia_aleatoria);    
}
    
18.10.2016 / 14:36