За последние 24 часа нас посетили 42545 программистов и 1816 роботов. Сейчас ищут 854 программиста ...

Сортировка ассоциативного массива (snmprealwalk)

Тема в разделе "PHP для новичков", создана пользователем NewUse, 18 июл 2018.

  1. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Даже не знаю как подступиться, php можно сказать, что и не знаю, а то, что знаю, явно не достаточно, Вроде бы задача тривиальная, но найти готового решения так и не удалось.

    Дано:
    php 5.3.23
    libsnmp 5.7.2
    snmprealwalk возращает таблицу в виде хэша:

    '1.2.3.4.aa.1.0'=>'StdNumber', value=>'требуемое значение 1'
    '1.2.3.4.aa.2.0'=>'StdNumber', value=>'требуемое значение 2'
    '1.2.3.4.bb.1.0'=>'StdNumber', value=>'требуемое значение 3'
    '1.2.3.4.bb.2.0'=>'StdNumber', value=>'требуемое значение 4'

    хотелось бы получить хэш хэшей, вида:
    [
    aa => {'1'=>'требуемое значение 1',
    '2'=>'требуемое значение 2'}
    bb=>{'1'=>'требуемое значение 3',
    '2'=>'требуемое значение 4'}
    ]

    смотрел в сторону array_map и array_filter но не выходит каменный цветочек....
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1. $new_arr = [];
    2. foreach($arr as $a) {
    3.     foreach($a as $k => $v) {
    4.         $index = "";
    5.         $key = "";
    6.         $value = "";
    7.         if($v === "StdNumber") {
    8.             $key = substr($k, -3, 1);
    9.             $index = substr($k, -6, 2);
    10.         }
    11.         if($k === "value") $value = $v;
    12.         if($index && $key && $value) $new_arr[$index][$key] = $value;
    13.     }
    14. }
    15. var_dump($new_arr);
    --- Добавлено ---
    хотя лучше explode(".", $k)
    --- Добавлено ---
    Ты кстати форум не перепутал? Может тебе руби нужен?
     
  3. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Не, ограничить по значению ключа "StdNumber" нельзя (оно не всегда такое), можно regexp по маске,
    но примерное понял, буду разбираться.

    СПАСИБО! думал одним массивом обойтись, а то не очень красиво огромные массивы в копии в памяти держать.

    Не с руби вообще не знаком, и нужно именно на пхп.
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1. if($k !== "value") $key=substr($k,-3,1);
    В php в многомерных массивах другой синтаксис
     
  5. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Ну так я и говорю, что с пхп почти не знаком :)
    Спасибо, идею понял, буду пробовать реализовать, пока с помощью хитрых параметров snmp удалось изменить исходный массив до вида
    Код (Text):
    1. '1.2.3.4.aa.1.0'=>'требуемое значение 1'
    2. '1.2.3.4.aa.2.0'=>'требуемое значение 2'
    3. '1.2.3.4.bb.1.0'=>'требуемое значение 3'
    4. '1.2.3.4.bb.2.0'=>'требуемое значение 4'
    т.е. можно избавиться от одного вложенного цикла, уже прогресс, буду копать дальше :)
     
  6. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Ещё один вопросик от чайника по php-шному массиву, чтоб тем не плодить:
    имеется ассоциативный массив, выбираю из него значение одного элемента:
    $ap_ind=$row[server];
    получаю из adodb fetchRow
    проверяю:
    var_dump($ap_ind);
    Выдаёт:
    string(13) "192.168.1.104"
    Передаю как аргумент, функции, которая на входе ожидает строку:

    получаю предупреждение:
    Warning: snmprealwalk() expects parameter 1 to be string, array given in snmpwalk.php on line 20
    Warning: Invalid argument supplied for foreach() in snmpwalk.php on line 21

    строки 20 и 21:
    PHP:
    1.     $snmp = snmprealwalk($ap_ind, "public", "$oid");
    2.     foreach($snmp as $a => $v) {
    Что ему не нравится?
     
  7. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    UPD: Не актуально, ошибся с датой в логах.