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!

2
  • 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? Commented Mar 11, 2016 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! Commented Mar 11, 2016 at 14:42

2 Answers 2

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.
Sign up to request clarification or add additional context in comments.

1 Comment

And here is the sandbox, if you are interested :-) sandbox.onlinephpfunctions.com/code/… However I don't know how long it will remain there.
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!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.