New question

Question:

Date: 20-03-2019 19:41:13 (In Spanish)

Eliminar elementos de un array si está presente valores de otro array[Resolved]

Hola a todos.

Espero que esten bien.

Tengo un problema que no he podido resolver el cual es el siguiente.
Tengo 2 arrays cuyos valores en cada uno son numéricos y únicos (no se repiten dentro del array)

Un array $listaTRPtotal donde contiene números del 2001 al 2071 generados por un for. Es decir una tabla numérica del 2001 al 2071. Son valores fijos que no serán modificados. Son 71 elementos.

Otro array $TRP la cantidad de elementos son variables y cuyo valores tambien son variables porque depende de una respuesta de una API, para hacerlo mas facil expondré un array de ejemplo.

Necesito eliminar los elementos del array $listaTRPtotal cuyo valores esten presentes en el array $TRP

Código:


// genero un array de 71 elementos cuyo valores tendrán del 2001 al 2071
for ($x=0;$x<=70;$x++){
    $listaTRPtotal[$x] =2001+ $x;
}

// Array variable
 $TRP[] =2003;
 $TRP[] =2019;
 $TRP[] =2090;

echo "Array total<br>";
print_r($listaTRPtotal);
echo '<hr>';
echo "Array variable<br>";
print_r($TRP);



El array $listaTRPtotal deberia ser similar al de la imagen sin los valores marcado en rojo que son los valores del array $TRP

Entre otras cosas he probado con array_diff() y no resuelve el caso ya que sirve para otra utilidad la función.
$listaTRPfail = array_diff($TRP, $listaTRPtotal);


Si se les ocurre otra idea de en vez de eliminar elementos es bienvenida.

Muchas gracias por la atención.

Quedo en la espera de respuesta

Saludos

Tags: Array PHP - PHP - Question Votes: 0 - Answers: 5 - Views: 12 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 21-03-2019 01:41:42 Me parece raro lo que informas de que array_filter no te elimine la secuencia dada, ya que si hago esto, el array resultante es el original sin los elementos de $TRP, imagino ha de haber sido porque invertiste los arreglos en array_diff.

    
    $listaTRPtotal = [];
    
    for ($x=0;$x<=70;$x++){
        $listaTRPtotal[$x] =2001+ $x;
    }
    var_dump($listaTRPtotal);
    
    $TRP = [2003,2019,2070];
    
    
    $filtro = array_diff($listaTRPtotal,$TRP);
    var_dump($filtro);
    
    






    en caso contrario, se me ocurre crearte un metodo y utilizar array_search para la tarea, algo así:

    
    $listaTRPtotal = [];
    
    for ($x=0;$x<=70;$x++){
        $listaTRPtotal[$x] =2001+ $x;
    }
    
    $TRP = [2003,2019,2070];
    
    function removeItem(int $value){
        global $listaTRPtotal;
        $key = array_search($value,$listaTRPtotal);
        if($key){
            unset($listaTRPtotal[$key]);
            return true;
        }else{
            return false;
        }
    }
    
    foreach($TRP as $item){
        var_dump(removeItem($item));
    }
    var_dump($listaTRPtotal);
    
    


    Esto nos daría como resultado un array sin los elementos repetidos.

    Espero te sirva, si se me ocurre alguna otra cosa, con gusto la agrego.
      Votes: 1 - Link answer
     
  • Date: 21-03-2019 05:17:23 Lo primero que se me viene a la mente es esto:
    foreach($listaTRPtotal as $i) if(!in_array($i, $TRP)) $result[] = $i;
    print_r($result);
    

    :D
      Votes: 1 - Link answer
     
  • Date: 21-03-2019 09:27:35 Hola Walter,
    Podrías clarificar la razón por la que array_diff no es lo que buscas?

    En mi caso es la solución más sencilla que funciona con tu ejemplo:

    <?php
    // genero un array de 71 elementos cuyo valores tendrán del 2001 al 2071
    for ($x=0;$x<=70;$x++){
        $listaTRPtotal[$x] =2001+ $x;
    }
    // Array variable
    $TRP[] =2003;
    $TRP[] =2019;
    $TRP[] =2090;
    echo "Array total<br>";
    print_r($listaTRPtotal);
    echo '<hr>';
    echo "Array variable<br>";
    print_r($TRP);
    
    echo 'Array sin valores de TRP:<br/>';
    print_r(array_values(array_diff($listaTRPtotal, $TRP)));
    
      Votes: 1 - Link answer
     
  • Date: 21-03-2019 18:20:56 Muchas gracias a Carlos, Jorge, Ernesto por responder contribuyendo con sus conocimientos.
    Ire probando cada una de sus sugerencias y les iré dando mi feedback a la medida que lo vaya probando.

    Mas Tarde probare el codigo de Jorge

    Ernesto:
    Con respecto del uso de array_diff no tengo nada en su contra, es lo primero que intente utilizar, es porque he probado varias formas y no me ha dado resultado, dicho esto, por ejemplo he probado tu codigo y funciona correctamente pero al intentarlo de implementar en mi codigo no funciona por alguna razón que no me doy cuenta su porque.



    En el codigo que utilizo falla con el array TRP que tengo.

    $listaTRPfail = array_values(array_diff($listaTRPtotal, $TRP));


    Array TRP es el que obtuve en este momento de la cuasi API

    Array Total
    
    Array ( [0] => 2001 [1] => 2002 [2] => 2003 [3] => 2004 [4] => 2005 [5] => 2006 [6] => 2007 [7] => 2008 [8] => 2009 [9] => 2010 [10] => 2011 [11] => 2012 [12] => 2013 [13] => 2014 [14] => 2015 [15] => 2016 [16] => 2017 [17] => 2018 [18] => 2019 [19] => 2020 [20] => 2021 [21] => 2022 [22] => 2023 [23] => 2024 [24] => 2025 [25] => 2026 [26] => 2027 [27] => 2028 [28] => 2029 [29] => 2030 [30] => 2031 [31] => 2032 [32] => 2033 [33] => 2034 [34] => 2035 [35] => 2036 [36] => 2037 [37] => 2038 [38] => 2039 [39] => 2040 [40] => 2041 [41] => 2042 [42] => 2043 [43] => 2044 [44] => 2045 [45] => 2046 [46] => 2047 [47] => 2048 [48] => 2049 [49] => 2050 [50] => 2051 [51] => 2052 [52] => 2053 [53] => 2054 [54] => 2055 [55] => 2056 [56] => 2057 [57] => 2058 [58] => 2059 [59] => 2060 [60] => 2061 [61] => 2062 [62] => 2063 [63] => 2064 [64] => 2065 [65] => 2066 [66] => 2067 [67] => 2068 [68] => 2069 [69] => 2070 [70] => 2071 [71] => 2072 ) 
    
    Array TRP
    
    Array ( [0] => 2002 [1] => 2003 [2] => 2004 [3] => 2005 [4] => 2006 [5] => 2007 [6] => 2008 [7] => 2009 [8] => 2010 [9] => 2011 [10] => 2012 [11] => 2013 [12] => 2014 [13] => 2015 [14] => 2016 [15] => 2017 [16] => 2018 [17] => 2019 [18] => 2021 [19] => 2022 [20] => 2023 [21] => 2024 [22] => 2025 [23] => 2026 [24] => 2027 [25] => 2028 [26] => 2029 [27] => 2030 [28] => 2031 [29] => 2032 [30] => 2033 [31] => 2035 [32] => 2036 [33] => 2037 [34] => 2038 [35] => 2039 [36] => 2041 [37] => 2042 [38] => 2043 [39] => 2044 [40] => 2045 [41] => 2046 [42] => 2047 [43] => 2049 [44] => 2050 [45] => 2053 [46] => 2054 [47] => 2055 [48] => 2056 [49] => 2057 [50] => 2058 [51] => 2060 [52] => 2062 [53] => 2063 [54] => 2065 [55] => 2066 [56] => 2068 [57] => 2069 [58] => 2070 [59] => 2071 ) 
    
    Array diferencial
    
    Array ( [0] => 2001 [1] => 2002 [2] => 2003 [3] => 2004 [4] => 2005 [5] => 2006 [6] => 2007 [7] => 2008 [8] => 2009 [9] => 2010 [10] => 2011 [11] => 2012 [12] => 2013 [13] => 2014 [14] => 2015 [15] => 2016 [16] => 2017 [17] => 2018 [18] => 2019 [19] => 2020 [20] => 2021 [21] => 2022 [22] => 2023 [23] => 2024 [24] => 2025 [25] => 2026 [26] => 2027 [27] => 2028 [28] => 2029 [29] => 2030 [30] => 2031 [31] => 2032 [32] => 2033 [33] => 2034 [34] => 2035 [35] => 2036 [36] => 2037 [37] => 2038 [38] => 2039 [39] => 2040 [40] => 2041 [41] => 2042 [42] => 2043 [43] => 2044 [44] => 2045 [45] => 2046 [46] => 2047 [47] => 2048 [48] => 2049 [49] => 2050 [50] => 2051 [51] => 2052 [52] => 2053 [53] => 2054 [54] => 2055 [55] => 2056 [56] => 2057 [57] => 2058 [58] => 2059 [59] => 2060 [60] => 2061 [61] => 2062 [62] => 2063 [63] => 2064 [64] => 2065 [65] => 2066 [66] => 2067 [67] => 2068 [68] => 2069 [69] => 2070 [70] => 2071 [71] => 2072 ) 
    


    Con el codigo de Carlos me sucede exactamente lo mismo que con el codigo de Ernesto en mi codigo real falla. Es básicamente con lo que he probado antes de postear mi pregunta.

    ¿Pueden darse cuenta en qué puede fallar?

    Muchas Gracias

    Saludos
      Votes: 0 - Link answer
     
  • Date: 21-03-2019 20:28:30 He probado el codigo de Jorge

    for ($x=0;$x<=$totalPark-1 ;$x++){
        $listaTRPtotal[$x] =2001+ $x;
    }
    
     $TRP[] =2003;
     $TRP[] =2019;
     $TRP[] =2070;
    
    $listaTRPfail = array_values(array_diff($listaTRPtotal, $TRP));
    
    foreach($listaTRPtotal as $i) if(!in_array($i, $TRP)) $result[] = $i;;
    $listaTRPfail = $result;
    
    echo "Array Total<br>";
    print_r($listaTRPtotal);
    echo '<hr>';
    echo "Array TRP<br>";
    print_r($TRP);
    echo '<hr>';
    echo "Array diferencial<br>";
    print_r($listaTRPfail);




    El codigo propuesto me funciona correctamente en mi proyecto.

    Muchas gracias Jorge por tu solución Una solución distinta y elegante podría decir.

    No me quisiera quedar con la duda de porque no me estaría funcionando los códigos de Ernesto y de Carlos, Debería funcionar con array_diff()

    Muchas gracias por todas las respuestas
    Saludos
      Votes: 1 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com