2016-03-30 3 views
0

В настоящее время я ищу переписывание некоторых perl cgi-скриптов в php, в основном в порядке, чтобы я мог узнать php. Все идет хорошо, за исключением того, что я не могу разглядеть, как преобразовать хеш-хэш хеша хеша в массив php. Возьмите этот сценарий (не реальный, но идея такая же) У меня есть 5 сетевых узлов, называемых A, B, C, D, E. Каждый узел на самом деле стек из 3-х переключателей, называемых TOP, MIDDLE, BOTTOM Каждый коммутатор имеет 10 интерфейсов называется 1 до 10.Как преобразовать хеш-хэш хэша хэша в php

У меня есть сценарий, который опрашивает круглые каждый интерфейс и записывать ввод байтов в базе данных, как это : -

node switch interface bytes 
A  TOP  1   999 
B  MIDDLE  1   999 
A  MIDDLE  2   999 

и т.д.

Я могу прочитать базу данных в PHP, но я отклеился. В Perl'е я только читать данные и хранить его в хэш хэшей, обернув хотя запрос базы данных

`While $ref fetchrow_hashref() { 
    $hash{$ref{'NODE'}}{$ref{'Switch'}}{$ref{'Interface'}=$ref{'Bytes'} 
}` 

Так что теперь я могу получить доступ любое значение в моем CGI код, используя имена $hash{A}{Top}{1} вернутся 999

Но когда я пытаюсь сделать что-то подобное в php с ассоциативным массивом массивов, это происходит неправильно. Я использовал

$hash[]=[$ref["NODE"}=> 
    [$ref["Switch"]=> 
     [$ref["Interface"]=> 
      $ref["Bytes"] 
     ] 
    ] 
]; 

var_dump хэша выглядит правильно, но я, кажется, не быть в состоянии напечатать значение из массива с помощью print $hash[A][TOP][1];

Пожалуйста, я могу иметь указатели на мой ошибки

+0

Что такое массив '$ ref' в PHP-коде? Если вы установите значение '$ hash ['A'] ['TOP'] [1]', вы получите его обратно таким же образом. Ссылки автоматически разыменовываются в PHP, поэтому, например, итерация по массиву или массиву ссылок будет одинаковой. – syck

ответ

1

Это было бы

while($ref=somefetchingfunction_or_method()) { 
    $hash[$ref['NODE']][$ref['Switch']][$ref['Interface']]=$ref['Bytes']; 

(т.е. просто заменить все { на [,.по ] и фиксации недостающий последний ])

редактировать: sscce:

<?php 
$hash = []; 
foreach(gen_fetch() as $ref) { 
    $hash[$ref['NODE']][$ref['Switch']][$ref['Interface']]=$ref['Bytes']; 
} 
echo $hash['A']['TOP'][1]; 

// generator requires php version >= 5.5, see http://php.net/language.generators.overview 
function gen_fetch() { 
    $keys = ['NODE','Switch','Interface','Bytes']; 
    foreach([['A','TOP',1,997],['B','MIDDLE',1,998],['A','MIDDLE',2,999]] as $r) { 
     yield array_combine($keys,$r); 
    } 
} 

печатает 997.

+0

Спасибо за ввод, который заставил его работать. Извините за опечатки в исходном посте. – user3872809

Смежные вопросы