объединить php arrey в действии URL получить запрос - PullRequest
0 голосов
/ 05 января 2019

У меня есть 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
)

обратите внимание, что первый сигнал array генерируется при событии вызова, а второй набор array генерируется, когда я поднимаю трубку телефона (или, лучше сказать, при установлении вызова), поэтому во второй момент Я не могу сделать это только с одним URL-адресом действия, подобным этому

http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote&extension=$active_user

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

1 Ответ

0 голосов
/ 05 января 2019

Насколько я понимаю, это должно делать то, что вам нужно - ожидая, что идентификаторы будут уникальными.

<?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
}

EDIT:
Если вам нужен только последний вызов, нам не нужно повторно сохранять несовпадающие массивы, поэтому этот адаптированный код должен выполнить:

<?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 без очистка и запись этого в файл ...), не проверяет правильность ввода (что, если идентификатор не отправляется) и т. д. *

...