PHP поиск и сопоставление многомерного массива

#php #arrays

#php #массивы

Вопрос:

У меня есть 2 массива;

$customers_in_db содержит всех клиентов в БД (35 000 строк)

$new_customer_details содержит сведения об 1 клиенте, который импортируется в БД

Мне нужно иметь возможность сопоставлять импортирующего клиента по мобильному телефону и имени пользователя. Если они не совпадают на 100%, это не тот же клиент.

Одновременно импортируется около 800-1000 клиентов, поэтому перебирать каждого клиента в $customers_in_db для каждого нового клиента нецелесообразно… время ожидания сервера истекло.

Массив $new_customer_details

 Array
        (
            [0] => Array
                (
                    [forename] => Max
                    [mobile] => 123456789
                )
        
            [1] => Array
                (
                    [forename] => Smith
                    [mobile] => 456789123
                )
        )
  

Массив $customers_in_db

 Array
(
    [0] => Array
        (
            [id] => 754
            [forename] => Tom
            [mobile] => 5786413257
        )

    [1] => Array
        (
            [id] => 123
            [forename] => Max
            [mobile] => 123456789
        )
)
  

В приведенном выше случае:
$new_customer_details[0] должен совпадать с $customers_in_db[1]

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

Процесс РЕДАКТИРОВАНИЯ: MySQL, чтобы ВСЕ клиенты помещали каждого в многомерный массив

fgetcsv() перебирает каждую строку в файле csv в каждом цикле создает массив с данными клиентов используйте этот новый массив для сопоставления с существующим массивом клиентов, если есть совпадение, объедините данные клиента. Если совпадений нет, создайте новую запись клиента

 while($data = fgetcsv($f)){

      //Create array with details (Used later in script, so not only for matching to existing customers array)

      $customer_data = array(
        'forename' => $data[0],  
        'surname' => $data[1],
        'mobile' => $data[4]
      );

//This is what I have been trying, but not the right solution:
if(($customer_data['mobile'] != '') amp;amp; ($key = array_keys($current_customers, $details_to_search)) !== false){
               return 'Match'
            }
  

Я не могу предположить, что мобильный телефон присутствует для каждого нового клиента, поэтому присвоение ключу массива определенного значения может быть неправильным способом сделать это?

Комментарии:

1. Не уверен, как выглядит ваш запрос, но вы можете захотеть взглянуть на использование некоторой сортировки / индексации.

2. Можете ли вы подробнее рассказать об этом? Сейчас я выполняю простые тесты, поэтому мой запрос — это простой SELECT x от клиентов. Затем я помещаю их в массив исключительно для их хранения без необходимости выполнять дополнительные запросы. Каждый раз, когда возникает новый цикл customer, он должен просматривать этот массив и проверять, есть ли подходящие клиенты. Если они есть, то они будут объединены, иначе создайте новую запись.

3. если new_customers_details совпадает с customers_in_db тем, что вы хотите сделать? Я имею в виду сохранить совпадения в массиве?

4. Это будет проще, когда вы поделитесь своим фактическим кодом.

5. Было бы намного проще запрашивать базу данных для каждого клиента, которого вы хотите протестировать. Поскольку вы не предоставили общий доступ к своей схеме БД, мы не сможем вам в этом помочь. Если вы хотите сделать это, кэшируя всю базу данных в массиве (не рекомендуется), я предлагаю вам просто создать ключи, состоящие из <forename>-<mobile> (значения не имеют значения), и использовать array_key_exists() для проверки, существует ли данный клиент, например if (array_key_exists( "$forename-$mobile", $customers_in_db )) {...} , где $forename и $phone — это имя и номер телефона нового клиента, которого вы хотитетест.