У меня есть следующие два многомерных массива:
Первый массив:
$array_1_data = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
[1] => Array ( [id] => 2 [name] => Accounting [slug] => accounting )
)
Второй массив:
$array_2_data = Array (
[0] => Array ( [cid] => 3 [jid] => 24061 )
[1] => Array ( [cid] => 1 [jid] => 24062 )
)
Ожидаемый результат:
$some_array = Array (
[0] => Array ( [id] => 1 [name] => IT [slug] => it )
)
Я не против [cid]
в результате.
Я хочу пересечь эти два массива [id]
первого массива и [cid]
второго массива, как внутреннее соединение в MySQL. У меня есть основные foreach
а также if else
логика для этого, но скорость сейчас является приоритетом, поэтому я ищу решение без петель. Для лучшего понимания вот основное циклическое решение:
foreach ($array_1_data as $array_1_row ) {
foreach ($array_2_data as $array_2_row ) {
if ($array_2_row['cid'] == $array_1_row['id']) {
//intersection iteration
}
}
}
Я старался array_uintersection
следующее:
array_uintersect($array_1_data, $array_2_data, function($a1, $a2){
$diff1 = strcasecmp($a1['id'], $a2['cid']);
if ($diff1 != 0) return $diff1;
return 0;
});
Но это дает мне неопределенный индекс «id». Я проверил этот вопрос: Сравнение двух массивов с разными именами ключей. Первый ответ на этот вопрос дает зацикленное решение, которого я хочу избежать. Второй ответ предполагает изменение структуры SQL, но я не могу это контролировать. Так,
Есть ли действительно быстрое решение в такой ситуации?
Решение с использованием array_uintersect_uassoc
функция:
$result = array_uintersect_uassoc($array_1_data, $array_2_data, function($a, $b){
return strcasecmp($a['id'], $b['cid']);
}, function($a, $b){
return (int) [$a, $b] == ['id', 'cid'];
});
print_r($result);
Выход:
Array
(
[0] => Array
(
[id] => 1
[name] => IT
[slug] => it
)
)
Согласно вашему состоянию: пересечь эти два массива по [Я бы] первого массива и [чид] второго массива, мы должны рассмотреть функция сравнения ключей только для этих ключей ['id', 'cid']
,
Имея необходимые ключи на каждом шаге сравнения, остается только сравнить их значения (с функция сравнения значений)
http://php.net/manual/en/function.array-uintersect-uassoc.php
Других решений пока нет …