Объединить конкретный ключ и значение первого массива во второй массив

у меня 2 массива

$arr1 = Array ( 
    [0] => Array ( [customer_id] => 1 [Expire] => 2019-05-14 [paid] => 1 ) 
    [1] => Array ( [customer_id] => 2 [Expire] => 2019-06-20 [paid] => 0 ))

а также

$arr2 = Array ( 
    [0] => Array ( [id] => 3943 [customer_id] => 1 [Expire] => 2019-05-14 ) 
    [1] => Array ( [id] => 3944 [customer_id] => 1[Expire] => 2019-05-14 ) 
    [2] => Array ( [id] => 4713 [customer_id] => 2 [Expire] => 2019-06-20 ) 
)

и попробуйте поместить ключ первого массива и значение [paid] => 1 или 0 во второй массив, если идентификатор клиента и срок действия совпадают, например

Array ( 
    [0] => Array ( [id] => 3943 [customer_id] => 1 [Expire] => 2019-05-14 [paid] => 1) 
    [1] => Array ( [id] => 3944 [customer_id] => 1 [Expire] => 2019-05-14 [paid] => 1) 
    [2] => Array ( [id] => 4713 [customer_id] => 2 [Expire] => 2019-06-20 [paid] => 0) 
)

Я пытаюсь объединить массив в php, но не получаю того, что хочу. Есть ли какая-нибудь функция php для этого?

Что случилось с идентификатором 3945, customer_id 2? Почему этого нет в конечном желаемом результате?

Qirel 09.04.2019 10:35

Можете ли вы сделать индекс массива как customer_id вместо 0,1,2..etc? Это сделает вещи намного проще

Ali Elkhateeb 09.04.2019 10:37

значение customer_id не может быть 0

Deepak3301086 09.04.2019 10:40

Лучше всего показать нам, что вы пробовали, и сказать, где что-то идет не так. @Qirel Оскорбительный идентификатор был удален Deepak3301086 пять минут назад.

KIKO Software 09.04.2019 10:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
4
76
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

иногда можно сделать что-то сложное :)

<?php
$arr1 = [
    ['customer_id' => 1, 'Expire' => '2019-05-14', 'paid' => 1],
    ['customer_id' => 2, 'Expire' => '2019-06-20', 'paid' => 0],
];

$arr2 = [
    ['id' => 3943, 'customer_id' => 1, 'Expire' => '2019-05-14'],
    ['id' => 3944, 'customer_id' => 1, 'Expire' => '2019-05-14'],
    ['id' => 3945, 'customer_id' => 2, 'Expire' => '2019-05-14'],
    ['id' => 4713, 'customer_id' => 2, 'Expire' => '2019-06-20'],
];

foreach ($arr2 as &$item2) {
    foreach ($arr1 as $item1) {
        if (
            $item2['customer_id'] === $item1['customer_id']
            && $item2['Expire'] === $item1['Expire']
        ) {
            $item2['paid'] = $item1['paid'];
            break;
        }
    }
}
unset($item2);

var_dump($arr2);

Я думаю, что тройка ===, равная «Идентичный оператор», здесь чрезмерна. Двойное == равно «Оператор равенства». Мне действительно было бы все равно, был ли «id» 3943 (целое число) или "3943" (строка), более того, я бы подумал, что они равны и должны рассматриваться как таковые.

KIKO Software 09.04.2019 10:53

Это может решить проблему:

$arr1 = array(

            ["customer_id"=>1,"Expire"=> "2019-05-14", "paid"=>1],
            ["customer_id"=>2,"Expire"=> "2019-06-20", "paid"=>0]
    );


$arr2 = array(
           ["id"=>3943, "customer_id"=>1,"Expire"=> "2019-05-14"],
           ["id"=>3944,"customer_id"=>2,"Expire"=> "2019-06-20"],
           ["id"=>4713,"customer_id"=>1,"Expire"=> "2019-05-14"]
    );    


$result= array();    

function getRowByCustomerID($id, $array){
    foreach($array as $value){
        if ($value['customer_id'] ==$id){
            return $value;
        }
    }
    return null;
}    

foreach($arr2 as $subarr){

    $object = getRowByCustomerID($subarr['customer_id'],$arr1 );
    if (!is_null($object)){
        $object['id']=$subarr['id'];
        $result[]= $object;
    }
}    



var_dump($result);

вывод аналогичен тому, что вы ищете:

array(3) {
  [0]=>
  array(4) {
    ["customer_id"]=>
    int(1)
    ["Expire"]=>
    string(10) "2019-05-14"
    ["paid"]=>
    int(1)
    ["id"]=>
    int(3943)
  }
  [1]=>
  array(4) {
    ["customer_id"]=>
    int(2)
    ["Expire"]=>
    string(10) "2019-06-20"
    ["paid"]=>
    int(0)
    ["id"]=>
    int(3944)
  }
  [2]=>
  array(4) {
    ["customer_id"]=>
    int(1)
    ["Expire"]=>
    string(10) "2019-05-14"
    ["paid"]=>
    int(1)
    ["id"]=>
    int(4713)
  }
}

Ваш $arr2 не такой, как в вопросе. Смотрите «платные» ключи.

KIKO Software 09.04.2019 10:57

вы правы, я просто обновляю свой ответ, это не повредит результату. спасибо @KIKOSoftware

Yassine CHABLI 09.04.2019 11:04

Если вы не можете изменить макет первого массива, я думаю, будет лучше сначала создать промежуточный массив, в котором будут храниться записи всех дат истечения срока действия для каждого клиента.

Следующая реализация не требует использования вложенного цикла.

<?php
$arr1 = [
    ['customer_id' => 1, 'Expire' => '2019-05-14', 'paid' => 1],
    ['customer_id' => 2, 'Expire' => '2019-06-20', 'paid' => 0],
];

$arr2 = [
    ['id' => 3943, 'customer_id' => 1, 'Expire' => '2019-05-14'],
    ['id' => 3944, 'customer_id' => 1, 'Expire' => '2019-05-14'],
    ['id' => 3945, 'customer_id' => 2, 'Expire' => '2019-05-14'],
    ['id' => 4713, 'customer_id' => 2, 'Expire' => '2019-06-20'],
];

// Create a list of all paid, expiry dates, keyed by customer_id
$payed = [];

foreach ($arr1 as $item) {
    if (!isset($payed[$item['customer_id']])) {
        $payed[$item['customer_id']] = [];
    }
    $payed[$item['customer_id']][] = $item['Expire'];
}

// Lookup the customer and expire date for every entry
$arr2 = array_map(function($item) use ($payed) { 
    $item['paid'] = in_array($item['Expire'], $payed[$item['customer_id']] ?? []);
    return $item;
}, $arr2);

Результат:

Array
(
[0] => Array
    (
        [id] => 3943
        [customer_id] => 1
        [Expire] => 2019-05-14
        [paid] => 1
    )

[1] => Array
    (
        [id] => 3944
        [customer_id] => 1
        [Expire] => 2019-05-14
        [paid] => 1
    )

[2] => Array
    (
        [id] => 3945
        [customer_id] => 2
        [Expire] => 2019-05-14
        [paid] => 
    )

[3] => Array
    (
        [id] => 4713
        [customer_id] => 2
        [Expire] => 2019-06-20
        [paid] => 1
    )

)

Посмотреть демо

Ответ принят как подходящий

Зациклите свой второй массив $arr2 и найдите индекс первого массива $arr1, где столбец customer_id такой же, как в текущей итерации $arr2. array_search() возвращает этот индекс, который мы затем можем использовать для получения индекса paid этого массива. Затем мы добавляем его в наш массив $arr2, выполнив $a['paid'] = $paid;.

Поскольку мы зацикливаем массив по ссылке (& перед $a в цикле), внесенные в него изменения будут применены обратно к исходному массиву.

foreach ($arr2 as &$a) {
    $customerID = $a['customer_id'];      // This customer ID
    $arr1_key = array_search($customerID, array_column($arr1, 'customer_id'));   // Find the index of this customerID in the first array
    $paid = $arr1[$arr1_key]['paid'];     // Find the paid value matching that customer ID
    $a['paid'] = $paid;
}

Обновлять
Если вам нужно, чтобы он соответствовал идентификатору, а также дате истечения срока действия, используйте array_filter() для получения элемента массива в $arr1, который соответствует дате и идентификатору. Используя reset(), мы используем первый элемент в этом массиве.

foreach ($arr2 as &$a) {
    // Find the sub-array of $arr1 that matches this array's date and ID
    $arr1_match  = array_filter($arr1, function($v) use ($a) {
        return $v['customer_id'] == $a['customer_id'] && $v['Expire'] == $a['Expire'];
    });
    // Get the first element from the result
    $paid = reset($arr1_match)['paid'];
    // Append the paid-value to this array (done by reference)
    $a['paid'] = $paid;
}

Это, конечно, хорошее решение. Просто хочу отметить, что вы могли бы сделать это наоборот: foreach ($arr1 as и выполнить поиск в столбце $arr2. Почему? Потому что кажется, что $arr1 — это информация о входящем платеже, а $arr2 — существующий список клиентов. Я бы также поместил array_column($arr1, 'customer_id') вне цикла foreach. Но эй, это мелкие детали, это, безусловно, лучшее решение. Вы получаете мой голос.

KIKO Software 09.04.2019 11:03

Хм, вполне может быть. Проблема в том, что во втором массиве есть несколько экземпляров каждого идентификатора клиента, но только один в первом. В первом массиве также меньше записей, чем во втором. Это означает, что получить желаемый результат будет немного сложнее (это означает, что вы не можете использовать приведенный выше фрагмент, просто заменив $arr1 на $arr2 и наоборот). Вы, вероятно, правы насчет определений массивов.

Qirel 09.04.2019 11:09

Да, я только что понял это. Это заставляет вас делать это таким образом. Было бы лучше, если бы массивы в вопросе имели собственные имена, такие как $payments, $customers или $orders, что дало бы вам лучшее представление о том, с чем вы имеете дело.

KIKO Software 09.04.2019 11:12

Спасибо, это работа для меня. Это экономит время второго цикла.

Deepak3301086 09.04.2019 11:16

Это работает только для совпадения идентификатора клиента, если дата отличается, это не работает. Пожалуйста, проверьте 3v4l.org/TeTpK

Deepak3301086 09.04.2019 11:25

Нужно найти индекс обоих (customer_id и Expire). затем сопоставьте оба индекса, если они совпадают, то поставьте платное значение.

Deepak3301086 09.04.2019 11:35

Затем используйте array_filter(), чтобы получить правильный подмассив в $arr1. Смотрите пересмотренный ответ.

Qirel 09.04.2019 11:45

Другие вопросы по теме