3

I have the next arrays:

$noticias = [
    "0" => Array(
        "codigo" => "AMBITO"),
    "1" => Array(
        "codigo" => "ELSOL"),
    "2" => Array(
        "codigo" => "MDZ")
    ]

$portales = [
    "0" => Array(
        "codigo" => "LOSANDES"),
    "1" => Array(
        "codigo" => "MDZ"),
    "2" => Array(
        "codigo" => "ELSOL")
    ]

I need to compary both arrays by attribute codigo. The result would be:

$result = [
    "1" => Array(
        "codigo" => "ELSOL"),
    "2" => Array(
        "codigo" => "MDZ")
    ]

How can i do? At this moment, i have this:

$noticias_provinciales = array_uintersect($noticias, $portales, function($noticia, $portal_provincial){            
                $portal_codigo_noticia = $noticia['Portal__codigo'];
                $portal_codigo_provincial = $portal_provincial->codigo;
                return ($portal_codigo_noticia === $portal_codigo_provincial ? 0: 1);            
            });

But it doesn't work for me. I was debbuging and i notice that the both variables $noticia and $portal_provincial are from the same array ($noticia). I want that the first variable from function be $noticia (from $noticias) and the second one be $portal (from $portales). How can i do this?

Thanks!

Chitrank Dixit
  • 3,961
  • 4
  • 39
  • 59
McFly
  • 65
  • 7
  • Your samples are arrays of arrays, your code has arrays and objects, and also keys doesn't match (where is 'Portal__codigo' in `$noticias`?): can please uniform code with examples with avoid misunderstanding? Also: do you want as result an array with **all elements** of two source array grouped by same _codigo_, or you want filter arrays by specific _codigo_? – fusion3k Mar 11 '16 at 14:37
  • You were right! I'm sorry! This is the correct form: $noticias = [ "0" => Array( "codigo" => "AMBITO"), "1" => Array( "Portal__codigo" => "ELSOL"), "2" => Array( "Portal__codigo" => "MDZ") ] I wanna filter the $noticias array by the objects that match with the second one, as i put it above. The result must be only the objects that match. In this case, "ELSOL" and "MDZ". And "AMBITO" must not be in the array! Am i clear? Thanks! – McFly Mar 11 '16 at 14:42

2 Answers2

0

I have put your code in a PHP sandbox and improved it, so the following will run at least under PHP 5.4.10 up to PHP 7.

$noticias = [
    "0" => Array(
        "codigo" => "AMBITO"),
    "1" => Array(
        "codigo" => "ELSOL"),
    "2" => Array(
        "codigo" => "MDZ")
]; // no changes here

$portales = [
    "0" => Array(
        "codigo" => "LOSANDES"),
    "1" => Array(
        "codigo" => "MDZ"),
    "2" => Array(
        "codigo" => "ELSOL")
]; // no changes here


$noticias_provinciales = array_uintersect($noticias, $portales, function($noticia, $portal_provincial){            
            $portal_codigo_noticia = $noticia['codigo'];
            $portal_codigo_provincial = $portal_provincial['codigo'];
            return strcasecmp($portal_codigo_noticia, $portal_codigo_provincial);            
        });

var_dump($noticias_provinciales);

The issues with your code were (from my point of view):

  • Access to the array members was wrong. $portal_provincial->codigo doesn't work as $portal_provincial is not an object. There is no index named 'Portal__codigo'.
  • The usage of strcasecmp($portal_codigo_noticia, $portal_codigo_provincial) and ($portal_codigo_noticia === $portal_codigo_provincial ? 0: 1) is not the same. Right now I can't explain why, but for me only strcasecmp() works. However, strcasecmp() is more elegant yet probably a bit slower.
peter_the_oak
  • 3,529
  • 3
  • 23
  • 37
  • And here is the sandbox, if you are interested :-) http://sandbox.onlinephpfunctions.com/code/e3e437cdabbfe56ee25896ad18b6f9966b93737e However I don't know how long it will remain there. – peter_the_oak Mar 11 '16 at 15:39
0

thanks for you replied. I just copied the code as you typed and doesn't work for me! The array given is empty! I don't understand why!

The result was on console:

Check: noticiaCodigo: CLARIN provincialCodigo: PAGINA12 Comparison: -13
Check: noticiaCodigo: SITIOANDINO provincialCodigo: CLARIN Comparison: 16
Check: noticiaCodigo: DIARIOUNO provincialCodigo: CLARIN Comparison: 1
Check: noticiaCodigo: LANACION provincialCodigo: CLARIN Comparison: 9
Check: noticiaCodigo: ELSOL provincialCodigo: CLARIN Comparison: 2
Check: noticiaCodigo: AMBITO provincialCodigo: CLARIN Comparison: -2
Check: noticiaCodigo: LANACION provincialCodigo: ELSOL Comparison: 7
Check: noticiaCodigo: LANACION provincialCodigo: PAGINA12 Comparison: -4
Check: noticiaCodigo: SITIOANDINO provincialCodigo: LANACION Comparison: 7
Check: noticiaCodigo: DIARIOUNO provincialCodigo: LANACION Comparison: -8
Check: noticiaCodigo: ELSOL provincialCodigo: DIARIOUNO Comparison: 1
Check: noticiaCodigo: SITIOANDINO provincialCodigo: PAGINA12 Comparison: 3
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: provincialCodigo: Comparison: 0
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6
Check: noticiaCodigo: AMBITO provincialCodigo: Comparison: 6

array (size=0)
  empty

And this is my full code that i tried:

$portales_nacional_provinciales = [];        
        $losandes = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'LOSANDES'])->first();
        array_push($portales_nacional_provinciales, $losandes);        
        $elsol = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'ELSOL'])->first();
        array_push($portales_nacional_provinciales, $elsol);
        $mdz = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'MDZ'])->first();
        array_push($portales_nacional_provinciales, $mdz);
        $diariouno = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'DIARIOUNO'])->first();
        array_push($portales_nacional_provinciales, $diariouno);
        $mendozapost = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'MENDOZAPOST'])->first();
        array_push($portales_nacional_provinciales, $mendozapost);
        $sitioandino = TableRegistry::get('Portales')->find('all', ['Portales.codigo' => 'SITIOANDINO'])->first();
        array_push($portales_nacional_provinciales, $sitioandino);

        $noticias_provinciales = array_uintersect($noticias, $portales_nacional_provinciales, function($noticia, $portal_provincial){            
                $portal_codigo_noticia = $noticia['Portal__codigo'];
                $portal_codigo_provincial = $portal_provincial['Portal__codigo'];
                echo "Check: noticiaCodigo: " . $portal_codigo_noticia . " provincialCodigo: " . $portal_codigo_provincial . " Comparison: " . strcasecmp($portal_codigo_noticia, $portal_codigo_provincial) . "</br>";
                return strcasecmp($portal_codigo_noticia, $portal_codigo_provincial);            
            });
        var_dump($noticias_provinciales);

The only thing i done was to change the name of one variable and the field from "codigo" for "Portal__codigo". "Portal__codigo" is the name of the attribute in "$noticias" recovered from database. I'm usig PHPCake3.

Thanks!

McFly
  • 65
  • 7