Объединить массив php по запросу на получение URL-адреса действия

У меня есть 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-кодер, поэтому просто хочу получить предложение написать цикл .. большое спасибо

Это только эти 2 массива? Тогда подойдет array_merge($firstArray, $secondArray);.

Jeff 05.01.2019 01:04

спасибо, но это не так просто .. Я думаю, что мне нужно написать отношение foreach ..

silvered.dragon 05.01.2019 01:06
Примечание: Я бы посоветовал записать либо json_encode($_GET), либо хотя бы serialize($_GET) в журнал, потому что вы никогда не сможете прочитать эти данные снова, поскольку php не может анализировать вывод print_r (изначально)
Jeff 05.01.2019 01:09

Итак, просто для моего понимания: в журнале должно быть много массивов с разными идентификаторами или только эти два? И вы хотите их объединить после (хотя бы первый) они в лог записывались? В основном добавление второго, не так ли?

Jeff 05.01.2019 01:11

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

silvered.dragon 05.01.2019 01:19

У каждого нового звонка новый ID?

Jeff 05.01.2019 01:24

да, идентификатор начинается с id = 1 и увеличивается, но после 5 минут простоя телефона он снова сбрасывается до id = 1. на самом деле мне было бы достаточно иметь в журнале только последний слитый массив. это для моего разработчика crm, которому нужно получить этот журнал для всплывающего окна входящего вызова. crm действительно настроен и не поддерживает api моей реализации звездочки, а URL-адреса действий - единственный способ получить расширение, которое ответило на вызов. так что последнего объединенного массива будет достаточно

silvered.dragon 05.01.2019 01:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
0
7
74
1

Ответы 1

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

<?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 часа ночи. Я завтра попробую ваш код и сообщу результат, по крайней мере, у меня есть отправная точка ..

silvered.dragon 05.01.2019 01:50

Разве вам не нужен флаг true / 1 в функции декодирования json, чтобы получить массив вместо объекта? Я думал, что поиск по массиву / столбец не удастся найти на объекте

TCooper 05.01.2019 01:59

@TCooper Вы абсолютно правы, я его поменял, спасибо!

Jeff 05.01.2019 02:00

хорошо, я попробовал код с уникальным идентификатором и получил следующее: входящий вызов звонит на добавочных номерах, в моем журнале [{"ID": "4", "remote": "+ 39123456789"}, затем я принимаю вызов и журнал становится [{"ID": "4", "remote": "+ 39123456789"}, {"ID": "4", "extension": "2‌ 35"}], это не массив. ..

silvered.dragon 05.01.2019 04:16

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

silvered.dragon 05.01.2019 04:20

В моем коде у меня все еще был жестко запрограммированный (тестовый) ID: array_search('10',, это, конечно, должен быть array_search($_GET['ID'],. Вы это уже изменили?

Jeff 05.01.2019 18:37

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

silvered.dragon 05.01.2019 20:01

Вы изменили (= удалили) последний параметр в file_put_contents()? - FILE_APPEND больше не должно быть.

Jeff 05.01.2019 23:02

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