У меня есть следующие массивы:
$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
). Как я могу это сделать?
Спасибо!
Я поместил ваш код в песочницу 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()
более элегантный, но, вероятно, немного медленнее.спасибо, что ответили. Я просто скопировал код, как вы напечатали, и у меня не работает! Данный массив пуст! Я не понимаю почему!
Результат был на консоли:
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.
Спасибо!