comparar 2 arrays en php con > o <

Iniciado por demonstrator, 4 Septiembre 2014, 00:57 AM

0 Miembros y 1 Visitante están viendo este tema.

demonstrator

Hola saludos tengo un un problema que por mas que le busco no he dado con solucion tengo el siguiente para de arrays y de esto necesito comparar primero los nombres para filtrar los que son iguales para despues a sus cantidades aplicarles un criterio de si es mayor que > me arroje algun echo con las cantidades en si el problema no es tanto eso si no que no me arroje cosas como que se da el caso de que encuentra que es mayor que 2 valores del otro array y no tome en cuenta que su clave sea la misma


Array1 ( [nombre] => Array (
  • => lapiz [1] => pluma [2] => borrador )
               [cantidad] => Array (
  • => 4 [1] => 13 [2] => 1 ) )

    Array2 ( [nombre] => borrador [cantidad] => 2.00 )
    Array2 ( [nombre] => lapiz [cantidad] => 3.00 )
    Array2 ( [nombre] => pluma [cantidad] => 6.00 )

    Como dato adicional el primero es resultado de una lista de valores nombre y cantidad de 2 input text

    El segundo es resultado de un consulta a mysql y es arrojado a traves de un while y mysql_fetch_assoc

    Lo que espero de esta comparacion seria algo asi como:

    if ((array1[cantidad]>array2[cantidad]) and (array1[nombre]==array2[nombre])){
    echo array2[cantidad];}


    en este momento con estos valores muestra:
    NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL


    me supongo que no esta pasando el filtro de igualdad aunque no estoy muy seguro me podrian ayudar a hacer la comparacion?
    por que he hecho de todo en un momento funciono muy bien pero tenia el problema de que en casos como este el mismo numero que era mayor que su equivalente en el array2 resultaba tambien ser mayor que los otros 2 y aunque los otros 2 fueran menores que su equivalente  en el array un seguian apareciendo en el echo saludos quedo al pendiente cualquier cosa....


MinusFour

La estructura de tus arreglos me resulta confusa. ¿Puedes poner los arreglos en php?

demonstrator

#2
Código (php) [Seleccionar]
<?php 

$result1
=mysql_query("SELECT stock_name AS nombre, SUM(quantity) AS cantidad FROM stockut3.stock_sales WHERE '{$_POST['stock_name']}' LIKE '%{$_POST['stock_name']}%' and due='1969-12-31' AND stock_name!='' GROUP BY stock_name");


$result2=mysql_num_rows($result1);
$stockname=$_POST['stock_name'];
$cant=$_POST['quty'];

$contnombre=count($stockname);
$reingname array_fill(0$contnombre'nombre');
$reingcant =array_fill(0$contnombre'cantidad');
$multireingname =array_fill(0$contnombre$reingname);
$multireingcant =array_fill(0$contnombre$reingcant);
$multiname =array_fill(0$contnombre$stockname);
$multicant =array_fill(0$contnombre$cant);

$reing=array_combine($multireingname[0], $multiname);
$reing1=array_combine($multireingcant[0], $multicant);
$reing2=array_merge($reing$reing1);





 
while($result2 mysql_fetch_assoc($result1)) { 


    
   if((
$reing2['nombre']==$result2['nombre'])and($reing2['cantidad']>$result2['cantidad'])){
var_dump($reing2['cantidad']);

}}
?>


le hice algunas midificaciones pero en esencia esto es lo que tengo sigo sin poder hacer una comparacion correcta

MinusFour

#3
Suponiendo que $stockname es un arreglo como:

Código (php) [Seleccionar]

array("lapicero", "borrador");


y $cant:

Código (php) [Seleccionar]

array(4, 3);


Después de todos los malabares que haces con los arreglos deberías acabar con:
Código (php) [Seleccionar]

array(2) {
 ["nombre"]=>
 array(2) {
   [0]=>
   string(8) "lapicero"
   [1]=>
   string(8) "borrador"
 }
 ["cantidad"]=>
 array(2) {
   [0]=>
   int(3)
   [1]=>
   int(4)
 }
}


Cuando tu haces:

Código (php) [Seleccionar]

$reing2['nombre'] == $result2['nombre']


Realmente estás comparando un arreglo:

Código (php) [Seleccionar]

array(2) {
   [0]=>
   string(8) "lapicero"
   [1]=>
   string(8) "borrador"
 }


Con un valor de la tabla que me imagino puede ser cualquiera de las opciones que pasas por Stockname:

Código (php) [Seleccionar]

$result2['nombre'] = 'lapiz';
//o
$result2['nombre'] = 'borrador';


Si quieres comparar nombres, debes hacer un for (o foreach):

Código (php) [Seleccionar]

foreach($reing2["nombre"] as $key => $value){
if($value == $result2['name']){
if($reing2["cantidad"][$key] < $result2["cantidad"]){
$maximo = $result2["cantidad"];
$minimo = $reing2["cantidad"][$key];
} else {
$maximo = $reing2["cantidad"][$key];
$minimo = $result2["cantidad"];
}
}
}


Y si esa es la estructura que quieres finalmente, no necesitas hacer todos esos arreglos:

Código (php) [Seleccionar]

$array = array('nombre' => $stockname, 'cantidad' => $cant);

demonstrator

#4
no lo habia pensado de esa manera lo probare y te cuento como me fue.... nada mas como comentario la razon de los arreglos que hice con todos eso llenados de arrays y y array_combine y final array merge en efecto fue para ordenar los arrays originales que me entregan arreglos no asociativos en un solo array de arrays que me relacione los arrays $stockname y $cant.

tengo 2 input text a los cuales les puedo insertar varios valores uno es para stockname y otro es para $cant y el par de arrays que me arrojan son:

Array (
  • => 4 [1] => 15 [2] => 1 )
    Array (
  • => lapiz [1] => pluma [2] => borrador )

    mientras que el array que la consulta me entrega es un array de arrays asociativo del tipo:

    print_r($result2);
    resultado:
    Array ( [nombre] => borrador [cantidad] => 2.00 )
    Array ( [nombre] => lapiz [cantidad] => 3.00 )
    Array ( [nombre] => pluma [cantidad] => 6.00 )

    esto ya habia intentado resolverlo con foreach y de hecho no he descartado la idea solo que lo quite del ultimo codigo para cuestiones de pruebas con el array que hice con el array_merge

    Código (php) [Seleccionar]
    <?php
    $result1
    =mysql_query("SELECT stock_name AS nombre, SUM(quantity) AS cantidad FROM stockut3.stock_sales WHERE '{$_POST['stock_name']}' LIKE '%{$_POST['stock_name']}%' and due='1969-12-31' AND stock_name!='' GROUP BY stock_name");

    $result2=mysql_num_rows($result1);
    $stockname=$_POST['stock_name'];
    $cant=$_POST['quty'];
    $numero=$_POST['numero'];
     
    while($result2 mysql_fetch_assoc($result1)) { 
     
    foreach(
    $stockname as $reingreso ){

    foreach($result2 as $nombre=>$articulo){
        
       if(
    $reingreso==$articulo) {

         foreach(
    $result2 as $cantidad=>$numero ){

    foreach($cant as $recant){


    if(
    $numero<$recant){

    ?>

    </form>
       <input name="numero1" id="numero1" type="text" class="round my_text_box" value="<?php echo $numero;?>"  >
    &nbsp;&nbsp;<?php
    }}}}}}} ?>



    Pero me sucedio que la comparacion de las cantidades del array $cant con su variable iterativa $recant la hacia indiscriminadamente con todos los elementos del campo $cantidad del array $result que seria: $result2['cantidad'] en su variable iterativa $numero lo que provoca que si mas de algun elemento $cantidad del array $result2 resulta ser menor que algun elemento del array $cant sin tomar en cuenta que este ultimo se encuentre o no relacionado con su equivalente de $result2['cantidad'] que se llama $stockname (hay que tomar en cuenta que en este caso en efecto no estan relacionados por ser arrays independientes provenientes de entradas de datos distintas) esto provoca que me muestre en el echo $numero; datos que se interpretan como:

    la cantidad de plumas=16 a ingresar es mayor que la cantidad de plumas que se han prestado=6 y tambien es mayor que la cantidad de lapices=4 que se han prestado=3 por supuesto tambien lapices=4 y es mayor que 3 en resumen me daba un salida asi:
    6
    3
    3
    esto a todas luces es un error ya que el resultado deberia ser:
    6
    3

    de cualquier manera pondre en practica tu solucion y te comento cualquier duda y de antemano muchisimas gracias por tu tiempo te comento cualquier cosa espero poder contar con tu apreciable ayuda


    MOD: Obligatorio usar etiquetas GeSHi. [Obligatorio] Normas del subforo de PHP.




    hola que tal pues con la noticia que ya implemente tu solucion y funciono de maravilla al principio tuve un problema con los resultados:
    en la parte que dice
    Código (php) [Seleccionar]

    if($value == $result2['name'])

    se lo cambie por 'nombre' y quedo asi

    Código (php) [Seleccionar]

    foreach($reing2["nombre"] as $key => $value){
    if($value == $result2['nombre']){
    if($reing2["cantidad"][$key] < $result2["cantidad"]){
    $maximo = $result2["cantidad"];
    $minimo = $reing2["cantidad"][$key];
    } else {
    $maximo = $reing2["cantidad"][$key];
    $minimo = $result2["cantidad"];
    }
    }
    }

    y por cuestiones de arreglos de resultados le agregue lo siguiente:
    Código (php) [Seleccionar]

    if($minimo!=$result2["cantidad"]){
    print_r($minimo);
    }$minimo=$_POST['minimo'];
    $maximo=$_POST['maximo'];

    por ahora solo tengo el problema de como hacer que dependiendo de la existencia de este dato me permita o no hacer submit para insertar los datos del array de los input text he estado haciendo pruebas y agruegue algo asi como:
    Código (php) [Seleccionar]

    if(empty($_POST['minimo'])){ //esto estoy tratando de hacer para evitar que se haga la insercion de datos dependiendo de los resultados de la comparacion en el foreach                                   
    for($i=0;$i<count($stock_name);$i++)
                                                {
    $count = $db->countOf("stock_avail", "name='$stock_name[$i]'");
    if($count == 0)
    {
    $db->query("insert into stock_avail(name,quantity) values('$stock_name[$i]',$quty[$i])");
    //echo "<br><font color=green size=+1 >Nueva entrada a Stock registrada!</font>" ;

    $db->query("insert into stock_details(stock_id,stock_name,stock_quatity,supplier_id,company_price,selling_price) values('$autoid','$stock_name[$i]',0,'$supplier',$cost[$i],$sell[$i])");

     
    $db->query("INSERT INTO stock_entries(stock_id,stock_name, stock_supplier_name, quantity, company_price, selling_price, opening_stock, closing_stock, date, username, type, total, payment, balance, mode, description, due, subtotal,count1,billnumber) VALUES ( '$autoid1','$stock_name[$i]','$supplier',$quty[$i],$cost[$i],$sell[$i],0,$quty[$i],'$date','$username','reentry',$total[$i],$payment,$balance,'$mode','$description','$due',$subtotal,$i+1,'$bill_no')");

    }

    else if($count==1)
    {

    $amount = $db->queryUniqueValue("SELECT quantity FROM stock_avail WHERE name='$stock_name[$i]'");
    $amount1 = $amount + $quty[$i];
    $db->execute("UPDATE stock_avail SET quantity=$amount1 WHERE name='$stock_name[$i]'");
    $db->query("INSERT INTO stock_entries(stock_id,stock_name,stock_supplier_name,quantity,company_price,selling_price,opening_stock,closing_stock,date,username,type,total,payment,balance,mode,description,due,subtotal,count1,billnumber) VALUES ('$autoid1','$stock_name[$i]','$supplier',$quty[$i],$cost[$i],$sell[$i],$amount,$amount1,'$date','$username','reentry',$total[$i],$payment,$balance,'$mode','$description','$due',$subtotal,$i+1,'$bill_no')");



    }//corresponde a if(empty($_POST['minimo'])){


                            }
    }
                           // $msg="Reingreso agregado satisfactoriamente Ref: ". $_POST['stock_name']."" ;
    //header("Location: agregar_reingreso.php?msg=$msg");
    }

                                            }

    En la parte de:
    Código (php) [Seleccionar]

    if(empty($_POST['minimo']))

    trato de condicionar la ejecucion del insert al estado de la variable $minimo solo que sigue permitiendo la insercion de los datos en la tabla sabes que me podria estar fallando?

MinusFour

Se me escapo un nombre, pienso en inglés cuando programo.

Te recuerdo que el $minimo y $maximo cambian de acuerdo al ciclo. Al final del foreach, $maximo y $minimo son los últimos que se encontraron cuando coincidieron los nombres del arreglo y el valor de la tabla.

No entiendo muy bien que es lo que quieres hacer, ¿Puedes darme una idea de como quieres que opere tu programa?

demonstrator

Por supuesto que si, me pasa algo parecido con lo del ingles... pero bueno volviendo al tema te comento que en esta parte del programa lo que necesito hacer es condicionar el ingreso de articulos que fueron asignados a prestamo y que seran reingresados al stock del sistema esto para controlar la existencia de herramienta o equipo que no este dado de alta en el sistema y que no haya resgistro que se haya prestado oviamente el sistema debio haberlos dado de alta con anterioridad a traves de una compra hecha esta parte esta resuelta en si la parte de control de prestamos de herramientas es la que esta todavia pendiente y por lo demas solo necesito controlar el reinreso de equipos previamente prestados para mantener el stock apegado a la realidad el flujo de trabajo seria como el que sigue:

tabla ingreso articulo comprado------tablastock------tabla salida de articulos
tabla reingreso articulo prestado-----tablastock------tabla salida a prestamo

de esto cuando haya un reingreso de un articulo sera necesario verificar que ese articulo este registrado como prestado es decir la tabla que la consulta que hago v seria la de"salidas a prestamo" de esta forma control tanto lo que sale como lo que reingresa y la unica forma en que los prestamos pueden sar mayores que los reingresos son por que hay compras que se ingresan a tablastock y de ahi cada producto agarra su destino en el caso de los que salen simplemente salen y no regresan fin de la historia pero en el caso de los que se prestan si necesito verificarlos de tal manera que el stock no sufra corrupciones por ingresos extras que en realidad son compras o simplemente no existen, por lo de los valores minimo y maximo si me ha quedado claron como funcionan ya los probe con diferentes situaciones