#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
— это имя и номер телефона нового клиента, которого вы хотитетест.