【问题标题】:How to compare two arrays with condition using 'array_uintersec'?如何使用'array_uintersec'比较两个数组的条件?
【发布时间】:2016-06-26 20:01:15
【问题描述】:

我有下一个数组:

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

但这对我不起作用。我正在调试,我注意到$noticia$portal_provincial 这两个变量都来自同一个数组($noticia)。 我希望函数的第一个变量是$noticia(来自$noticias),第二个是$portal(来自$portales)。我该怎么做?

谢谢!

【问题讨论】:

  • 您的示例是数组的数组,您的代码有数组和对象,并且键不匹配($noticias 中的“Portal__codigo”在哪里?):请统一代码与示例并避免误解?另外:您是否想要一个包含两个源数组的 所有元素 的数组,它们按相同的 codigo 分组,或者您想要通过特定的 codigo 过滤数组?
  • 你是对的!对不起!这是正确的形式: $noticias = [ "0" => Array( "codigo" => "AMBITO"), "1" => Array( "Portal__codigo" => "ELSOL"), "2" => Array ( "Portal__codigo" => "MDZ") ] 我想通过与第二个匹配的对象过滤 $noticias 数组,正如我在上面所说的。结果必须只有匹配的对象。在这种情况下,“ELSOL”和“MDZ”。并且“AMBITO”不能在数组中!我清楚了吗?谢谢!

标签: php arrays intersection


【解决方案1】:

我已将您的代码放入 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() 更优雅,但可能会慢一些。

【讨论】:

【解决方案2】:

感谢您的回复。我只是在您键入时复制了代码,对我不起作用!给定的数组是空的!我不明白为什么!

结果在控制台上:

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

我唯一做的就是将一个变量的名称和字段从“codigo”更改为“Portal__codigo”。 “Portal__codigo”是从数据库中恢复的“$noticias”中属性的名称。我正在使用 PHPCake3。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-25
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多