如何使用' array_uintersec&#39 ;?将两个数组与条件进行比较?

时间:2016-03-11 14:18:23

标签: php arrays intersection

我有下一个阵列:

$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")
    ]

我需要按属性codigo比较两个数组。结果将是:

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

我该怎么办?此刻,我有这个:

$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);            
            });

但它对我不起作用。我正在进行debbuging,我注意到变量$noticia$portal_provincial来自同一个数组($noticia)。 我希望函数的第一个变量是$noticia(来自$noticias),第二个变量是$portal(来自$portales)。我怎么能这样做?

谢谢!

2 个答案:

答案 0 :(得分:0)

我已将您的代码放在PHP沙箱中并对其进行了改进,因此以下内容至少在PHP 5.4.10下运行到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);

您的代码存在问题(从我的角度来看):

  • 访问阵列成员是错误的。 $portal_provincial->codigo不起作用,因为$portal_provincial不是对象。没有名为'Portal__codigo'的索引。
  • strcasecmp($portal_codigo_noticia, $portal_codigo_provincial)($portal_codigo_noticia === $portal_codigo_provincial ? 0: 1)的使用情况不尽相同。现在我无法解释原因,但对我来说只有strcasecmp()有效。但是,strcasecmp()更优雅,但可能有点慢。

答案 1 :(得分:0)

谢谢你的回复。我只是在输入时复制了代码,但对我来说并不起作用!给出的数组是空的!我不明白为什么!

结果是在控制台上:

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

这是我尝试的完整代码:

$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);

我唯一做的就是改变一个变量的名称和来自&#34; codigo&#34; for&#34; Portal__codigo&#34;。 &#34; Portal__codigo&#34;是&#34; $ noticias&#34;中属性的名称。从数据库中恢复我使用PHPCake3。

谢谢!