Problema con la función de matriz de php mostrando sólo el primer elemento en el array ignorando el resto

Estoy tratando de hacer una función para mostrar los elementos del cliente en un array, sin embargo sólo el primer id del elemento se muestra en el array. ¿Qué tiene de malo mi código? Supongo que estoy haciendo algo malo con el array.

Ejemplo sItem valor: https://pastebin.pl/view/e492ffa1

    $items = array();
    $client_item = bin2hex($u->sItem);
    $x = 0;
    for ($i = 0; $i < 78; $i++) {
        $item = hexdec(reverse(substr($client_item, $x, 8)));

        if ($item != 0) {
            $ii = $db->get_object("SELECT * FROM Clients.dbo.ITEM WHERE Num =" . $item);
            if (is_object($ii)) { 
               $items[] = array("ItemID" => $ii->Num, "ItemSlot" => $i);
            }
        }
        $x += 16;
    }

El código anterior mostrará sólo el primer artículo en el array. Todos los demás no se muestran.

var items = [{"ItemID":310511133,"ItemSlot":0}]

No estoy seguro de lo que estoy haciendo mal. Si me quito $x += 16; entonces simplemente añadir más entradas en el array con el primer elemento id. Quiero más entradas pero no con el mismo id obviamente. :)

 var items = [{"ItemID":310511133,"ItemSlot":0},{"ItemID":310511133,"ItemSlot":1},{"ItemID":310511133,"ItemSlot":2},{"ItemID":310511133,"ItemSlot":3},{"ItemID":310511133,"ItemSlot":4}....

Este es el reverse función:

function reverse($str)
{
    $len = strlen($str);
    $i = $len - 2;
    $ret = NULL;
    while (0 <= $i) {
        $ret .= substr($str, $i, 2);
        $i -= 2;
    }
    return $ret;
}

Pregunta hecha hace 3 años, 4 meses, 27 días - Por codeglitch


3 Respuestas:

  • Buscar bases de datos no devolver ningún objeto SELECT * FROM Clients.dbo.ITEM WHERE Num = $item

    puede confirmar que los valores existen en la base de datos

    puede hacer eco del valor $item y ver manualmente en la base de datos son esos valores existen.

    Respondida el Dec 18, 2020 a las 05:00 - por Brian

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando parece estar relacionado con la forma en que estás incrementando la variable $x en tu bucle for, causando que siempre obtengas el mismo primer elemento en el array.

    En el bucle for, estás incrementando $x en 16 sin tener en cuenta el avance en la cadena hexadecimal. Por lo tanto, siempre estás leyendo el mismo segmento de 8 caracteres de la cadena hexadecial $client_item.

    Para solucionar este problema, deberías ajustar cómo incrementas $x para asegurarte de que avance correctamente a través de la cadena hexadecimal en cada iteración. Aquí te dejo una posible solución:

    php
    $items = array();
    $client_item = bin2hex($u->sItem);
    $x = 0;
    for ($i = 0; $i < 78; $i++) {
        $item = hexdec(reverse(substr($client_item, $x, 8)));
    
        if ($item != 0) {
            $ii = $db->get_object("SELECT * FROM Clients.dbo.ITEM WHERE Num =" . $item);
            if (is_object($ii)) { 
               $items[] = array("ItemID" => $ii->Num, "ItemSlot" => $i);
            }
        }
        $x += 8; // Incrementa en 8 en lugar de 16
    }
    

    En este caso, he modificado la línea $x += 16; a $x += 8; para asegurarme de que avances en segmentos de 8 caracteres en la cadena $client_item en cada iteración. Con este ajuste, deberías obtener una lista de elementos en el array $items que corresponda a diferentes ítems y ranuras de ítems en lugar de repetir el primer ítem.

    Respondida el Dec 19, 2020 a las 05:00 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código es que estás incrementando el valor de $x por 16 en cada iteración del bucle for. Esto hace que saltes 15 elementos del array $client_item en cada iteración, lo que resulta en que solo se lea el primer elemento.

    Para solucionar este problema, debes incrementar $x por 8 en cada iteración, ya que cada elemento del array $client_item es un número hexadecimal de 8 caracteres.

    Aquí tienes el código corregido:

    php
    $items = array();
    $client_item = bin2hex($u->sItem);
    $x = 0;
    for ($i = 0; $i < 78; $i++) {
        $item = hexdec(reverse(substr($client_item, $x, 8)));
    
        if ($item != 0) {
            $ii = $db->get_object("SELECT * FROM Clients.dbo.ITEM WHERE Num =" . $item);
            if (is_object($ii)) { 
                $items[] = array("ItemID" => $ii->Num, "ItemSlot" => $i);
            }
        }
        $x += 8;
    }
    

    Este código incrementará $x por 8 en cada iteración, lo que garantizará que se lean todos los elementos del array $client_item.

    Respondida el Dec 19, 2020 a las 05:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0