es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el contador de iteraciones al comparar arrays en 2 bucles foreach usando PHP.

Tengo 2 arrays de los que me gustaría obtener el total de votos. El array uno es de propuestas de usuario y el array dos es de votos de usuario en las propuestas. Estoy intentando comparar los 2 y contar el total de votos para cada propuesta.

Aquí están los 2 arrays:

$props = json_decode('[{"proposal":"propuesta 1", "owner":"tom", "lock_time":1639440607},{"proposal":"propuesta 2", "owner":"bob", "lock_time":1639455554}]', true);

$votes = json_decode('[{"vote":"aprobar", "owner":"tom", "prop-id":1639440607},{"vote":"rechazar", "owner":"bob", "prop-id":1639455554},{"vote":"rechazar", "owner":"tom", "prop-id":1639440607}]', true);

La salida deseada es la siguiente:

Propuesta 1 = 1 Aprobar y 1 Rechazar
Propuesta 2 = 0 Aprobar y 1 Rechazar

La salida que obtengo es:

Propuesta 1 = 1 Aprobar y 1 Rechazar
Propuesta 2 = 1 Aprobar y 1 Rechazar

Aquí está mi intento que no está dando la salida deseada:

foreach($props as $props){

    $lock_time = $props['lock_time'];
    $my_proposal = $props['proposal'];

    foreach($votes as $votes){

        $id = $votes['prop-id'];
        $vote = $votes['vote'];

        if($lock_time == $id){
           if($vote == 'aprobar'){
               $yay++;
           }elseif($vote == 'rechazar'){
               $nay++;
           }
        }
    }

    echo 'Propuesta: '.$my_proposal.'<br>';
    echo 'Aprobaciones: '.$yay.'<br>';
    echo 'Rechazos: '.$nay.'<br>';
    echo '<br><br>';

}

Aquí está mi demo – http://sandbox.onlinephpfunctions.com/code/abea2fa828c067ce3efc1440af201fce839645b6

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida deseada, puedes hacer algunas modificaciones a tu código. Aquí tienes una versión actualizada:

    // Crear un array asociativo para almacenar los conteos de votos
    $vote_counts = array();
    foreach ($props as $prop) {
      $prop_id = $prop['lock_time'];
      $my_proposal = $prop['proposal'];
      $approve_count = 0;
      $reject_count = 0;
      foreach ($votes as $vote) {
        if ($prop_id == $vote['prop-id']) {
          if ($vote['vote'] == 'approve') {
            $approve_count++;
          } elseif ($vote['vote'] == 'reject') {
            $reject_count++;
          }
        }
      }
      $vote_counts[$my_proposal] = array(
        'Approve' => $approve_count,
        'Reject' => $reject_count,
      );
    }
    
    // Mostrar los resultados
    foreach ($vote_counts as $proposal => $counts) {
      echo "Propuesta $proposal = {$counts['Approve']} Aprobados y {$counts['Reject']} Rechazados<br>";
    }
    

    En este código, primero creamos un array asociativo $vote_counts para almacenar los conteos de votos para cada propuesta. Luego recorremos los arrays $props y $votes, y cada vez que encontramos un voto que coincide con una propuesta, incrementamos el conteo correspondiente en $vote_counts.

    Finalmente, recorremos $vote_counts para mostrar los resultados en el formato deseado. La salida de este código debería ser:

    Propuesta 1 = 1 Aprobado y 1 Rechazado
    Propuesta 2 = 0 Aprobado y 1 Rechazado
    

Comments are closed.