У меня есть IP-телефон, который через 2 URL-адреса делает запрос на получение на мой веб-сервер.
URL-адреса действий:
http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote
http://192.168.25.126/action.php?ID=$call_id&extension=$active_user
192.168.25.126 - это веб-сервер
action.php печатает в файл журнала запрос
$call_id - это уникальный идентификатор, который телефон присваивает текущему сеансу.
$remote - это номер звонящего
$extension - это добавочный номер IP-телефона.
на стороне сервера у меня есть action.php, который печатает в файле журнала запросы через эту простую строку
<?php
file_put_contents("/tmp/post.log",print_r($_GET,true), FILE_APPEND));
?>
проверяя журнал, я могу просмотреть ожидаемый запрос
tail -f /tmp/post.log
Array
(
[ID] => 9
[remote] => +39123456789
)
Array
(
[ID] => 9
[extension] => 235
)
Как я могу объединить в tmp.log массивы с таким же идентификатором, как этот?
Array
(
[ID] => 9
[remote] => +39123456789
[extension] => 235
)
Обратите внимание, что первый массив генерируется при звонке, а второй массив генерируется, когда я поднимаю трубку (или, лучше сказать, когда звонок установлен), поэтому во второй момент Я не могу сделать это только с одним URL-адресом действия, подобным этому
http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote&extension=$active_user
из-за ограничения моего IP-телефона, поэтому мне нужно объединить 2 массива. и, если возможно, я бы хотел, но в этом нет необходимости, чтобы журнал печатался только в том случае, если существует первый массив с таким же идентификатором (поэтому журнал будет отображаться только в том случае, если на входящий вызов будет дан ответ, а не когда я звоню). Я старший ИТ-специалист, а не php-кодер, поэтому просто хочу получить предложение написать цикл .. большое спасибо
спасибо, но это не так просто .. Я думаю, что мне нужно написать отношение foreach ..
json_encode($_GET), либо хотя бы serialize($_GET) в журнал, потому что вы никогда не сможете прочитать эти данные снова, поскольку php не может анализировать вывод print_r (изначально)
Итак, просто для моего понимания: в журнале должно быть много массивов с разными идентификаторами или только эти два? И вы хотите их объединить после (хотя бы первый) они в лог записывались? В основном добавление второго, не так ли?
Я хочу, чтобы в журнале были только объединенные массивы, объединенные массивы для каждого входящего вызова, который я принимаю
У каждого нового звонка новый ID?
да, идентификатор начинается с id = 1 и увеличивается, но после 5 минут простоя телефона он снова сбрасывается до id = 1. на самом деле мне было бы достаточно иметь в журнале только последний слитый массив. это для моего разработчика crm, которому нужно получить этот журнал для всплывающего окна входящего вызова. crm действительно настроен и не поддерживает api моей реализации звездочки, а URL-адреса действий - единственный способ получить расширение, которое ответило на вызов. так что последнего объединенного массива будет достаточно






Насколько я понимаю, это должно делать то, что вам нужно - ожидать, что идентификаторы будут уникальными.
<?php
// get data from log
$fileData = file_get_contents("/tmp/post.log");
$data = json_decode($fileData, true); // make an array out of the json
// $data will now be something like this:
# $data = [["ID" => 9,"remote" => "+39123456789"],["ID" => 10,"remote" => "+41123456789"]];
// mocking input data
# $_GET = ['ID' => 10, 'otherparam' => 'bar'];
$key = array_search($_GET['ID'], array_column($data, 'ID')); // search for pre-saved data
if ($key) { // an item with $ID was found -> merge new data
$item = array_merge($data[$key], $_GET);
$data[$key] = $item; // overwrite existing item with this ID
} else {
$item = $_GET; // create a new item, since we haven't found one
$data[] = $item; // append to data
}
file_put_contents("/tmp/post.log",json_encode($data,true))); // don't append, write the whole dataset
Если идентификаторы не уникальны, мы могли бы просто взять последний добавленный (через end (), проверить, совпадают ли идентификаторы и объединиться там:
end($data); // set pointer to the end
$key = key($data); // get the key of the last element
if ($data[$key]['ID']==$_GET['ID']) {
$item = array_merge($data[$key], $_GET); // merge old and new data
$data[$key] = $item; // overwrite item
}
Обновлено:
Если вам нужен только последний вызов, нам не нужно повторно сохранять несоответствующие массивы, поэтому этот адаптированный код должен:
<?php
$fileData = file_get_contents("/tmp/post.log");
$data = json_decode($fileData, true);
// $data will now be something like this:
# $data = ["ID" => 9,"remote" => "+39123456789"]; // note, this time it's a one-dimentional (but assoc) array.
// mocking input data
# $_GET = ['ID' => 9, 'otherparam' => 'bar'];
// check if we have pre-saved data, that has an 'ID' and that matches our current one:
if (is_array($data) && isset($data['ID']) && $data['ID']==$_GET['ID']) { // the saved $ID was found -> merge new data
$data = array_merge($data, $_GET);
} else {
$data = $_GET; // create a new item, since we haven't found one
}
file_put_contents("/tmp/post.log",json_encode($data,true))); // don't append, write the whole dataset
Заявление об ограничении ответственности: В этом коде вообще нет проверки ошибок, и он будет выдавать ошибки в пустой журнал (потому что json_decode завершится ошибкой, если еще нет данных), имеет некоторые проблемы с безопасностью (с использованием $ GET без очистки и записи в файл ...), не проверяет правильность ввода (что, если идентификатор не отправлен) и т. д.
Большое спасибо, к сожалению, я пишу из Италии, и вот 2 часа ночи. Я завтра попробую ваш код и сообщу результат, по крайней мере, у меня есть отправная точка ..
Разве вам не нужен флаг true / 1 в функции декодирования json, чтобы получить массив вместо объекта? Я думал, что поиск по массиву / столбец не удастся найти на объекте
@TCooper Вы абсолютно правы, я его поменял, спасибо!
хорошо, я попробовал код с уникальным идентификатором и получил следующее: входящий вызов звонит на добавочных номерах, в моем журнале [{"ID": "4", "remote": "+ 39123456789"}, затем я принимаю вызов и журнал становится [{"ID": "4", "remote": "+ 39123456789"}, {"ID": "4", "extension": "2 35"}], это не массив. ..
Я забыл упомянуть, что в последней строке была ошибка, и я удалил круглую скобку, превышающую
В моем коде у меня все еще был жестко запрограммированный (тестовый) ID: array_search('10',, это, конечно, должен быть array_search($_GET['ID'],. Вы это уже изменили?
мне нужен отдельный журнал, скажем, arrey.log, где присутствует только последний объединенный массив в момент объединения, потому что crm нужно читать только объединенный массив в объединенном объекте, ваш код работает, но журнал покажет в первый момент входящий звонок, а затем покажет объединенный массив.
Вы изменили (= удалили) последний параметр в file_put_contents()? - FILE_APPEND больше не должно быть.
Это только эти 2 массива? Тогда подойдет
array_merge($firstArray, $secondArray);.