Asterisk AMI AJAM Parser php
Разбор сырых данных от Asterisk Manager Interface(AMI).
в примере команда AMI -> QueueStatus
Имеем на входе форматированную строку,
содержащую символы перевода каретки и новой строки.
Это и используем для разбора данных.
В итоге получим отдельный ассоциативный массив для каждой сущности (очередь и ее агенты)
PHP
Предположим, что raw данные в переменной result.
Подорвем (explode
) через \r\n
и получим единый массив:
Ключи с пустыми значениями, это границы между сущностями. Они нам пригодятся.
При помощи implode
сольем все опять в одну строку, используя в качестве разделитля ;
:
Event: QueueParams;Queue: 5050;Max: 0;Strategy: rrmemory;Calls: 0;Holdtime: 4;TalkTime: 47;Completed: 73;Abandoned: 7;ServiceLevel: 60;ServicelevelPerf: 98.6;Weight: 0;;Event:....
Пустые ключи превратились в ;;
, воспользуемся этим.
explode
через ;;
разделит строку на сущности и поместит все значения отдельных сущностей, под один ключ:
Далее разберем каждое значение на отдельные массивы, при помощи foreach
.
Полный код:
<?php $result = explode("\r\n", $result); end($result); $count1 = key($result); $result = array_slice($result, 3, $count1); $result = array_slice($result, 0, $count1 - 8); array_shift($result); $result = implode(';',$result); $result = explode(';;',$result); end($result); $count2 = key($result); for($i = 0; $i <= $count2; ++$i){ $item = explode(';',$result[$i]); foreach($item as &$val) { list($k, $v) = array_pad(explode(': ', $val, 2), 2, null); $parse[$i][$k] = $v; } }
В итоге имеем разобранные на ассоциативные массивы сущности:
echo "<pre>"; print_r($parse); echo "</pre>";
В таком виде уже нормально использовать. Например скормить шаблонизатору в JSON: