php объединить два подмассива массива, где значение определенного ключа равно - PullRequest
1 голос
/ 23 апреля 2020

Здравствуйте и спасибо за ваш интерес

У меня есть два массива :

  1. [A] - от mysql запрос одной базы данных на сервере1 - $ postings_array - ВЫБОР всех публикаций цепочки обсуждений (на основе идентификатора цепочки)
  2. [B] -из mysql запроса другой базы данных на сервере2 - $ usersdata_array - ВЫБОР всех сообщений обсуждений (на основе идентификатора потока)

Это означает:

  • в [A] есть много под-массивов записей и в [B] одной или нескольких подпрограммах userdata-sub -arrays.
  • оба массива всегда содержат ключ с именем usrsID в каждом из своих подмассивов.
I need to extend the Sub-Arrays in $postings_array [A]

by merging them 

with the Sub-Arrays of the $usersdata_array [B]

based on WHERE the VALUE of the usrsID KEY in the sub-array[A] is EQUAL to the usrsID KEY in the sub-array[B].

ПРИМЕР:

Array [A]:
(
    [0] => Array
        (
            [ID] => 5
            [usrsID] => 3
            [tid] => 19
            [txtid] => 22
        )
    [1] => Array
        (
            [ID] => 6
            [usrsID] => 1
            [tid] => 19
            [txtid] => 23
        )
    [2] => Array
        (
            [ID] => 7
            [usrsID] => 2
            [tid] => 19
            [txtid] => 24
        )
    [3] => Array
        (
            [ID] => 8
            [usrsID] => 1
            [tid] => 19
            [txtid] => 25
        )
)

-

Array [B]:
(
    [0] => Array
        (
            [id] => 1
            [usrsID] => 1
            [avatarID] => 1

        )
    [1] => Array
        (
            [id] => 2
            [usrsID] => 2
            [avatarID] => 3

        )
    [2] => Array
        (
            [id] => 3
            [usrsID] => 3
            [avatarID] => 22

        )

)

необходимый результат (на [B] расширен [A] для примера выше):

Array [A_extended]:
(
    [0] => Array
        (
            [ID] => 5
            [usrsID] => 3
            [tid] => 19
            [txtid] => 22
            [id] => 3
            [avatarID] => 22
        )
    [1] => Array
        (
            [ID] => 6
            [usrsID] => 1
            [tid] => 19
            [txtid] => 23
            [id] => 1
            [avatarID] => 1
        )
    [2] => Array
        (
            [ID] => 7
            [usrsID] => 2
            [tid] => 19
            [txtid] => 24
            [id] => 2
            [avatarID] => 3
        )
    [3] => Array
        (
            [ID] => 8
            [usrsID] => 1
            [tid] => 19
            [txtid] => 25
            [id] => 1
            [avatarID] => 1
        )
)

... Я думаю, это общая проблема, поэтому должен быть лучший попрактикуйтесь (может быть в одной встроенной функции php или комбинации двух или трех из них) - и мне не нужно изобретать велосипед. По крайней мере, я надеюсь, что ...

иначе, мой подход будет

  1. проверить количество итераций (= подмассивы, найденные в $ usersdata_array [B])
  2. выполняет итерацию по externalHaystack и запускает функцию, когда $ needle был найден в innerHaystack
  3. , выполняет объединение с помощью checkSubArrayfun c

Подход с hayStackArray = complete [A] Array; needle = значение $ usrsID для подмассива [B]:

function checkSubArrayfunc($hayStackSubArray, $needle, $toMergeSubArray) {

        if (in_array(array('$hayStackSubArray'), $needle)) {
                array_merge_recursive($hayStackSubArray, $toMergeSubArray);
        }
    }

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Попробуйте:

foreach($arr_b as $b_item) {
    foreach($arr_a as $key => &$a_item) {
        if ($b_item['usrsID'] == $a_item['usrsID']) {
            $a_item['id'] = $b_item['usrsID'];
            $a_item['avatarID'] = $b_item['avatarID'];
        }
    }
}

Ваш вывод $_arr_a будет:

Array
(
    [0] => Array
        (
            [ID] => 5
            [usrsID] => 3
            [tid] => 19
            [txtid] => 22
            [id] => 3
            [avatarID] => 22
        )

    [1] => Array
        (
            [ID] => 6
            [usrsID] => 1
            [tid] => 19
            [txtid] => 23
            [id] => 1
            [avatarID] => 1
        )

    [2] => Array
        (
            [ID] => 7
            [usrsID] => 2
            [tid] => 19
            [txtid] => 24
            [id] => 2
            [avatarID] => 3
        )

    [3] => Array
        (
            [ID] => 8
            [usrsID] => 1
            [tid] => 19
            [txtid] => 25
            [id] => 1
            [avatarID] => 1
        )

)
0 голосов
/ 23 апреля 2020

Сначала возьмите пустой массив для сохраненного массива. затем пройденный в обоих массивах. если userID одинаковы в массиве элементов, пометьте эти массивы и pu sh в margeArr .

$margeArr = [];
foreach($Array_A as $a){
  foreach($Array_B as $b){
    if($a['usrsID'] == $b['usrsID']){
      array_push($margeArr,array_merge($a,$b));
    }
  }
}
print_r($margeArr);

Комментарий автора Вопросник: Это отличное решение - оно действительно отвечает требованиям, описанным в моем вопросе, и объединяет массив, который необходимо пометить, с парами ключ-значение в массиве «впрыскиваемый». Но я предпочитаю лучшее программистское решение в мире, где я могу переименовать ключи «en passant / on-the-fly»:

<code>foreach($arr_b as $b_item) {
    foreach($arr_a as $key => &$a_item) {
        if ($b_item['usrsID'] == $a_item['usrsID']) {
            $a_item['myNewKeyName1'] = $b_item['usrsID'];
            $a_item['myNewKeyName2'] = $b_item['avatarID'];
        }
    }
}
print("<pre>".print_r($arr_a,true)."
");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...