Как сравнить два массива с условием, используя array_uintersec?

У меня есть следующие массивы:

$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). Как я могу это сделать?

Спасибо!

3

Решение

Я поместил ваш код в песочницу 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() более элегантный, но, вероятно, немного медленнее.
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);

Единственное, что я сделал, это изменил имя одной переменной и поля с «codigo» на «Portal__codigo». «Portal__codigo» — это имя атрибута в «$ noticias», восстановленного из базы данных. Я использую PHPCake3.

Спасибо!

0

По вопросам рекламы [email protected]