我有一个IP电话,该电话通过2个操作网址向我的Web服务器发出了获取请求。
操作网址:
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
是Web服务器
action.php
正在将请求打印到日志文件
$call_id
是电话为当前会话提供的唯一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中合并具有相同ID的arrey?
Array
(
[ID] => 9
[remote] => +39123456789
[extension] => 235
)
请注意,铃声是在响铃事件中生成的,第二个arrey是在我第二次拿起电话时(或者说是在建立呼叫时)生成的 我只能使用一个这样的操作网址来做到这一点
http://192.168.25.126/action.php?ID=$call_id&remote=$display_remote&extension=$active_user
由于我的IP电话受到限制,因此我必须合并2个Arrey。并且,如果可能的话,我希望这样做,但这并不是真正必要的,只有在存在具有相同ID的第一个Arrey时才打印日志(因此,只有在接听来电时才显示日志,而在我拨打电话时才出现)。 我是一名高级IT人员,而不是php编码人员,所以只想建议写一个循环。.非常感谢
答案 0 :(得分:1)
据我了解,这应该可以满足您的需要-期望ID是唯一的。
<?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
如果ID不是唯一的,我们可以通过end()来获取最后添加的ID,检查ID是否匹配并在那里合并:
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无需清理并将其写入文件...),则不会测试输入是否正确(如果没有发送ID,该如何处理),等等...