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.

Intentando ver si un valor de una matriz existe en otra matriz usando PHP

Tengo estos dos arrays de la siguiente manera –

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

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

Cuando recorro los dos arrays, cuento los votos para cada propuesta. También me gustaría saber cuándo un usuario ha votado en cada propuesta. No puedo hacer que funcione como se espera. Aquí está mi bucle PHP –

$owner = 'tom';
foreach($props as $props){

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


    $approvals=0;
    $rejects=0;
    $is_voted = '';

    foreach($votes as $votes){

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


        if($lock_time == $id){

           if($owner == $vote_owner){
               $is_voted = 'true';
           }else{
               $is_voted = 'false';
           }

           if($vote == 'approve'){
               $approvals++;
           }elseif($vote == 'reject'){
               $rejects++;
           }
        }
     }

    echo $my_proposal.' Voted= '.$is_voted;

 }

Sospecho que es porque estoy verificando dentro del bucle de votos y mostrando fuera del bucle de votos, pero no estoy seguro de cuál es la forma correcta de hacerlo.

El resultado actual es todo “false”, el resultado esperado sería que Tom votó en 2 de las 3 propuestas, por lo que 2 son “true” y 1 es “false”.

Aquí tienes una demostración – http://sandbox.onlinephpfunctions.com/code/78d28ac1c251b0d006bfda6c2722b156bfaed32f

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para contar correctamente los votos para cada propuesta y determinar si un usuario ha votado en cada propuesta, es necesario mover la inicialización de $is_voted fuera del bucle que verifica los votos. Esto se debe a que solo deseas verificar si un usuario ha votado en una propuesta una vez, no cada vez que se recorre el array de votos.

    Aquí está el bucle PHP corregido:

    $owner = 'tom';
    
    foreach ($props as $prop) {
        $lock_time = $prop['lock_time'];
        $my_proposal = $prop['proposal'];
        $owner = $prop['owner'];
    
        $approvals = 0;
        $rejects = 0;
        $is_voted = '';
    
        foreach ($votes as $vote) {
            $id = $vote['prop-id'];
            $voter = $vote['vote-owner'];
            $vote_type = $vote['vote'];
    
            if ($lock_time == $id) {
                if ($owner == $voter) {
                    $is_voted = 'true';
                }
    
                if ($vote_type == 'approve') {
                    $approvals++;
                } elseif ($vote_type == 'reject') {
                    $rejects++;
                }
            }
        }
    
        if ($is_voted === '') {
            $is_voted = 'false';
        }
    
        echo $my_proposal . ' Votos a favor: ' . $approvals . ' Votos en contra: ' . $rejects . ' Votado: ' . $is_voted . '<br>';
    }
    

    En este bucle, la variable $is_voted se inicializa como una cadena vacía fuera del bucle de votos. Si el usuario no ha votado en la propuesta actual, $is_voted sigue siendo una cadena vacía y la actualizamos a ‘false’ después del bucle de votos. Esto asegura que solo verifiquemos el voto de un usuario una vez y la salida sea la esperada.

    La salida de este bucle debería ser:

    propuesta 1 Votos a favor: 1 Votos en contra: 1 Votado: true
    propuesta 2 Votos a favor: 0 Votos en contra: 1 Votado: false
    

Comments are closed.