PHP Как получить доступ ко всем элементам многомерного массива, если индексы не известны? - PullRequest
4 голосов
/ 26 июля 2011

Я использовал измененную версию кода здесь Определение классов, определенных в файле классов PHP , для создания многомерного массива классов и функций из определенного списка файлов. Я закончил с этим (я знаю, что имена испорчены, но я дурачился и должен был вернуться и изменить имена классов и имена функций в 3 разных файлах, поэтому давайте предположим, что это были допустимые имена классов и имен функций),

Array
(
    [0] => Array
        (
            [namethis_whatever_I_want] => Array
                (
                    [0] => another_function
                    [1] => whatever_function
                )

        )

    [1] => Array
        (
            [tc_class_simplevar] => Array
                (
                    [0] => set_var_test
                    [1] => get_var_test
                )

        )

    [2] => Array
        (
            [another_freekin_class] => Array
                (
                    [0] => some_function
                    [1] => another_crazy_function
                )

        )

)

Так что теперь мне нужно иметь доступ к именам классов и именам функций в каждом классе, не зная, каков индекс для любого из них. Я пытался использовать циклы, foreach и использовать счетчики, такие как $ i и $ ii, чтобы получить к ним доступ по числовому индексу, но ничего, что я пробую, не выведет ничего, кроме мусора или ошибок.

Я думал что-то вроде встроенного оператора foreach

$i = 0; 
foreach($array as $class){
  echo $class[$i];
  $ii = 0; 
  foreach($class as $val){
  echo $val[$ii];
  $ii++;
  }
$i++;
}

Но не повезло с этим.

Также пытается получить доступ к $ array [$ i] [$ i]; или $ array [$ i] [$ ii]; выдает ошибку смещение 0

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

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

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

Спасибо

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

Вы, ребята, правы в отношении foreach, но это было сложно. Задать вопрос было довольно полезно, если бы я сам рассказал о том, что мне нужно было найти, поэтому до меня дошло, в чем проблема.

В этом массиве 3 слоя. Есть массив, содержащий 3 массива, и у каждого из них есть индекс вместо числовой для его индекса. Каждый из них содержит свои элементы.

Поэтому мне пришлось перебирать массивы 1, 2, 3, чтобы получить индексы строки каждого из их элементов, а затем использовать этот элемент строки вместе с числовыми элементами, чтобы получить внутренние элементы большинства внутренних массивов. Хорошо, это смутило меня, но вот код, который работал для меня, с использованием эха и небольшого форматирования, чтобы я мог видеть, как он работает.

$size = sizeof($objectList);
for($i = 0; $i < $size; $i++){
    foreach($objectList[$i] as $key => $val){
        $className = $key;
        echo $className . ": <br/>";
        foreach($objectList[$i][$className] as $val){
            $functionName = $val;
            echo $functionName . " , ";
        }
    echo "<br/><br/>";
    }
}

Приведено в

namethis_whatever_I_want: другая_функция, любая_функция,

tc_class_simplevar: set_var_test, get_var_test,

another_freekin_class: some_function, another_crazy_function,

Для всех остальных, если это поможет, вот версия Marks с моими массивами и именами переменных для сравнения. Я бы сказал, что этот путь самый чистый, и он вырезает пару строк кода.

foreach($objectList as $objects){
    foreach($objects as $classname => $functions){
        $cn = $classname;
        foreach($functions as $functionname){
            $fn = $functionname;
        }
    }
}

Спасибо за помощь: -)

Ответы [ 2 ]

7 голосов
/ 26 июля 2011

foreach также позволяет указать ключевую часть итератора, поэтому вы можете циклически перемещаться по ассоциативным массивам следующим образом:

foreach($array as $key => $val){
    echo $array[$key]; // prints $val
}

Итак, в вашем случае:

foreach($rootarray as $classarray){
    foreach($classarray as $classname => $functions){
        // $classname contains the name of the class
        foreach($functions as $functionname){
            // $functionname contains the name of the function
        }
    }
}
0 голосов
/ 26 июля 2011

foreach ваш друг:

foreach($array as $key => $value) echo('$array['.$key.'] = '.$value);
...