PHP: динамически находить ключевые позиции в многомерном массиве - PullRequest
0 голосов
/ 02 июля 2010

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

У меня есть многомерный массив.Я хочу функцию, которая находит позицию данного ключа массива (все мои ключи массива являются строками), а затем возвращает позицию ключа в массиве, как массив.

Вот пример массива:

$arr = array
(
    'fruit' => array(
        'apples' => array(),
        'oranges' => array(),
        'bananas' => array()
    ),
    'vegetables' => array(
        'tomatoes' => array(),
        'carrots' => array(),
        'celery' => array(),
        'beets' => array
        (
            'bears' => array(),
            'battlestar-galactica' => array()
        ),
    ),
    'meat' => array(),
    'other' => array()
);

Функция должна иметь переменное / динамическое количество аргументов (т.е. необязательные аргументы).Аргументы представляют «уровни» (измерения) моего массива (ов).

Если функция вызывается с одним аргументом, функция должна искать только ключи на первом уровне / измерении массива (т.е.в этом примере это будут 'fruit', 'vegetables', 'meat' и 'other').
Если он вызывается с двумя аргументами, например, theFunction('vegetables', 'beets'), он должен искать ключ с именем 'vegetables' изатем найдите «вспомогательный» ключ с именем 'beets' (ТОЛЬКО в 'vegetables' уровне / ветви / измерении!) В этом примере он вернет array(1, 3).

Конечно, это должно работать с любымколичество уровней / размеров.

Ответы [ 2 ]

1 голос
/ 10 октября 2010

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

function findKey( $srcArray , $fndArray , $depth=0 ){
  if( ( $keyIndex[] = array_search( $fndArray[$depth] , array_keys( $srcArray ) ) )!==false ){
    if( is_array( $srcArray[$fndArray[$depth]] ) )
      $nextLevel = findKey( $srcArray[$fndArray[$depth]] , $fndArray , $depth+1 );
    if( $nextLevel===false )
      return $keyIndex;
    return array_merge( $keyIndex , $nextLevel );
  }
  return false;
}

Эта функция возвращает массив array( 1 , 3 ), используя предоставленные тестовые данные. Он будет обеспечивать сопоставленный массив до самого конца совпадения (т. Е. Если он может сопоставить первые 2 элемента из 3, возвращенный массив будет иметь номера для первых 2).

0 голосов
/ 02 июля 2010
function find($arr, $k1, $k2=null){
    if(!array_key_exists($k1, $arr)) //array level one only
        if(array_key_exists($k1, $arr))
            ;
        else
            ;
    else if(array_key_exists($k2, $arr[$k1]))
        ;
    else
        ;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...