New question

Question:

Date: 30-12-2018 21:30:25 (In Spanish)

Trabajar arrays con array_diff php[Resolved]

Hola necesito relacionar dos consultas y luego utilizar la función array_diff u otra que me permita sacar elementos del primer array contenidos en el segundo. Es decir, al recorrer el primer array con foreach me muestra los números de los equipos operativos. El segundo array selecciona aquellos números que han sido seleccionados, los cuales al cotejarlos con el primer array me los saque y no me permita asignar números repetidos de la primera consulta. Aqui parte de mi código:
//Se crea el nuevo objeto
$equipos = new Equipo;

$operativos = $equipos->EquiposOperativos("CPU");
$activos = $equipos->EquiposActivos("Activo");


$resultado1 = $operativos->fetchAll(PDO::FETCH_OBJ);

foreach ($resultado1 as  $valor1) {
  echo $a =  $valor1->equipo;
}

$resultado2 = $activos->fetchAll(PDO::FETCH_OBJ);

foreach ($resultado2 as $valor2) {
  echo $b = $valor2->equipo;
}


Aqui necesito sacar del array resultado1 aquellos valores presentes en el array $resultado2.

Gracias de antemano
Tags: Array PHP - PHP Votes: 0 - Answers: 3 - Views: 8 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 31-12-2018 11:27:21 ok no das muchos detalles sobre la estructura de los arrays de salida para saber si cuentan con una clave generica o una clave personalizada, en todo caso, podrias hacer esto:

    Con Clave Personalizada:
    Ejemplo:
    [
    	'1002'=>[
    		'campo1'=>'valor1',
    		'campo2'=>'valor2',
    		'campo3'=>'valor3',
    	],
    	'1003'=>[
    		'campo1'=>'valor1',
    		'campo2'=>'valor2',
    		'campo3'=>'valor3',
    	]
    ]
    
    //Podría ser algo así para la búsqueda y eliminación:
    foreach ($resultado1 as $clave => $valor) {
    	//Verificamos si la clave existe
    	if(array_key_exists($clave,$resultado2)){
    		//Si existe la eliminamos del segundo array
    		unset($resultado2[$clave]);
    	}
    	echo $a =  $valor1->equipo;
    }
    
    


    También podrías sobreescribir el arreglo2 eliminando los valores ya presentes en el primer array con:

    $resultado2 = array_diff_key($resultado2,$resultado1);
    

    De esta manera ya eliminas los valores por su clave que como se puede ver es mas corto y fácil de usar, claro está funciona con las claves, asi que si lo usas con un array con claves por defecto, podrías llegar a eliminar registros que no correspondan en cualquiera de los dos casos.

    Por otro lado si tienes un array multidimesional con clave simple, que creo es tu caso, yo me haría de una función que me ayude a la tarea, algo así:

    //Ejemplo de los arrays:
    $resultado1 = [
        ['nombre'=>'carlos','apellido'=>'quintero','cedula'=>'123456'],
        ['nombre'=>'saul','apellido'=>'brito','cedula'=>'321654']
    ];
    $resultado2 = [
        ['nombre'=>'carlos','apellido'=>'quintero','cedula'=>'123456'],
        ['nombre'=>'saul','apellido'=>'brito','cedula'=>'321654'],
        ['nombre'=>'ramon','apellido'=>'romero','cedula'=>'987654']
    ];
    
    //Función que buscará el valor de control
    function buscar($valor, $array){
        if(is_array($array)){
            $cant = count($array);
            $valid = 0;
            for($i=0; $i<$cant;$i++){
                if($array[$i]['cedula']==$valor){
                    $valid = 1;
                }
            }
            if($valid==1){
                return true;
            }else{
                return false;
            }
        }
    };
    
    //Recorro el array 2 para verificar si alguno de sus valores coincide con alguno del array1, si es asi, lo elimino de mi actual arreglo:
    
    foreach ($resultado2 as $clave => $valor) {
        //Verificamos si la clave existe
        $buscado = buscar($valor['cedula'],$resultado1);
    	if($buscado===true){
    		unset($resultado2[$clave]);
    	}
    }
    
    


    Esto nos daría como respuesta el array2 modificado sin los elementos que ya estan en el array1:

    array(1) { [2]=> array(3) { ["nombre"]=> string(5) "ramon" ["apellido"]=> string(6) "romero" ["cedula"]=> string(6) "987654" } }

    espero esto te sirva de ayuda para solucionar.


    Saludos
      Votes: 0 - Link answer
     
  • Date: 02-01-2019 12:19:29 Gracias amigo Carlos, sin embargo y disculpa mi desconocimiento, pero mi idea es que si el usuario ya ha asignado un número, al realizar una nueva consulta el número de equipo ya no aparezca en el select, donde el resultado1 proviene de una consulta mysql de aquellos equipos que están operativos. El array resultado2 es proviene de una consulta de usuarios activos donde el criterio de busqueda es el número de equipo asociado a cada usuario en ese momento, con el propósito de evitar asignar un mismo numero a dos usuarios activos, lo cual impide al momento de realizar una auditoria de quien usó los equipos existan registros con dos personas al mismo tiempo usando un mismo equipo. Las Consultas las almaceno en clases PDO en forma de objeto.Cuando recorro el array resultado1 (equipos operativos) queda de la siguiente manera:
    $equipos = new Equipo;
    
    $resultado1 = $equipos->EquiposOperativos("CPU");
    
    foreach( $resultado1 as $valor1){
    
    echo $valor1->equipo; // Imprime 3,4,5,6,7,8,9,10;
    }
    


    El segundo array (equipos activos en ese momento por ejemplo):

    $resultado2 = $equipos->EquiposActivos("Activo");
    
    foreach ($resultado2 as $valor2){
    echo $valor2->equipo; // Imprime 7,9 por ejemplo si son los numeros de equipos activos en ese momento
    }
    

    Pero al cruzar ambos array por separado no se cotejan, ya que cada array dentro de foreach lo recorre completo pero fuera de él solo muestra el último valor.
      Votes: 0 - Link answer
     
  • Date: 02-01-2019 17:59:48 Si me guío por el ejemplo que me estas dando, sería algo así:

    class Equipo{
        public function EquiposOperativos($x=null){
            //Resultado devuelto por tu consulta SQL
            return [3,4,5,6,7,8,9,10];
        }
    
        public function EquiposActivos($x=null){
            //Resultado devuelto por tu consulta SQL
            return [7,9];
        }
    
    }//
    
    $equipo = new Equipo();
    
    $resultado1 = $equipo->EquiposOperativos();
    $resultado2 = $equipo->EquiposActivos();
    
    $selector = array_diff($resultado1,$resultado2);
    
    //Equipos Activos:
    //imprime: 7,9
    foreach($resultado2 as $activo){
        echo "<li>Equipo Activo: ".$activo."</li>";
    }
    
    //Equipos Disponibles:
    //imprime: 3,4,5,6,8,10
    foreach($selector as $disponible){
        echo "<li>Equipo Disponible para Uso: ".$disponible."</li>";
    }
    


    Como puedes ver, el array que recorro para saber cuales son mis disponibles es el resultante al array_diff almacenado en la variable $selector.

    Ahora bien esta sería la forma de mostrar la información luego de cotejar el cruce de ambos arrays, por otro lado, podrías ayudarte con una tabla adicional en tu base de datos, donde registres dicha información y que esta a su vez, te sirva de historial de asignaciones para que puedas consultarla luego por fecha y así verificar que usuarios y en que momento usaron determinado equipo.

    No estoy viendo la estructura de tus resultados porque no lo indicas, solo me indicas que un nodo de tu array retorna dicha información así que en ella me vaso para mi respuesta, de no ser así muestra la estructura o posible estructura de tu array resultante y vemos que modificación hacer.


    Saludos Bro.
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In