2010-06-25 3 views
3

У меня есть два массива.PHP: получить ключи от независимых массивов

Пример первого массива:

 
$arrayOne = 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() 
); 

2-й:

 
$arrayTwo = array 
(
    'frewt' => array(
     'aplz' => array(), 
     'orangeez' => array(), 
     'bunanahs' => array() 
    ), 
    'vetchteblz' => array(
     'toem8ohs' => array(), 
     'careodds' => array(), 
     'sell-R-e' => array(), 
     'beats' => array 
     (
      'bare z' => array(), 
      'tablestar-neglectia' => array() 
     ), 
    ), 
    'neat' => array(), 
    'mother' => array() 
); 

Обратите внимание, что два массива находятся в том же «формат» (то же число измерений, количество ключей, порядка , и т. д.), только имена ключей различаются. (Клавиши массива в основном содержат все данные.)

У меня есть несколько переменных, которые адресуют ключи первого массива ($arrayOne). Например. $one будет обращаться к первому размеру первого массива, поэтому значение (строка) будет равным одному из 'fruit', 'vegetables', 'meat' или 'other'.
$two будет 'apples' или 'oranges' или 'bananas' или 'tomatoes' или 'carrots' и т. Д., Вы получите эту идею. (Для каждого измерения есть вары)
Как я уже сказал, эти переменные относятся только к адресу $arrayOne. Тем не менее, я хочу иметь возможность обращаться к клавишам во втором массиве. Смысл, глядя на значение $one Я хочу, чтобы иметь возможность получить array_key обоих массивов.

+0

Как вы хотите, чтобы обрабатывать случай, когда массив ключей происходит несколько раз в первом массив? – Artefacto

+0

Это не имеет значения, так как идентичные ключи будут переводиться на одни и те же ключи во втором массиве. Например. дважды ключ «апельсины» будет дважды во втором массиве, как «orangeez». Мне действительно нужна строка соответствующих ключей второго массива. – user367217

+0

OK, мое решение прекращает поиск после того, как находит первый ключ, но изменить его можно, чтобы вернуть позиции для всех ключей. – Artefacto

ответ

4
$arrayOne = //... 

$arrayTwo = //... 

function getPosition(array $arr, $key) { 
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr), 
     RecursiveIteratorIterator::SELF_FIRST); 
    $pos = array(); 
    foreach ($it as $k => $v) { 
     if (count($pos) - 1 > $it->getDepth()) { 
      array_pop($pos); 
      $pos[$it->getDepth()]++; 
     } 
     elseif (count($pos) - 1 < $it->getDepth()) { 
      array_push($pos, 0); 
     } 
     else { 
      $pos[$it->getDepth()]++; 
     } 
     if ($k === $key) { 
      return $pos; 
     } 
    } 
} 

function getElementKey(array $arr, array $position) { 
    $cur = $arr; 
    $curkey = null; 
    foreach ($position as $p) { 
     reset($cur); 
     for ($i = 0; $i < $p; $i++) { 
      next($cur); 
     } 
     $curkey = key($cur); 
     $cur = current($cur); 
    } 
    return $curkey; 
} 

var_dump(getPosition($arrayOne, "battlestar-galactica")); 
var_dump(getElementKey($arrayTwo, array(1, 3, 1))); 

дает:

 
array(3) { 
    [0]=> 
    int(1) 
    [1]=> 
    int(3) 
    [2]=> 
    int(1) 
} 
string(19) "tablestar-neglectia" 

Вы можете кормить результат getPosition к getElementKey:

getElementKey($arrayTwo, getPosition($arrayOne, "battlestar-galactica")); 
+0

Спасибо, но я не уверен, как это помогает? И не будет значения «здесь», это будет пустой массив. – user367217

+0

@tsha Если вам нужен ключ, а не значение, замените «возвращаемый ток ($ cur)» на «return key ($ cur)». Затем 'getElement ($ arrayTwo, getPosition ($ arrayOne," battlestar-galactica "));' даст '' tablestar-neglectia'' – Artefacto

+0

Спасибо, но я не смог заставить его работать. Не могли бы вы отредактировать свой пост и показать мне? Может быть, даже проверить это? Было бы замечательно! Благодарю. – user367217

0

Отметьте array_keys из обоих массивов, а затем сопоставьте позиции. Как array_keys для ваших массивов даст вам -

$arrayKeyOne = array('fruit', 'vegetables', 'meat', 'other'); 
$arrayKeyTwo = array('frewt', 'vetchteblz', 'meat', 'mother'); 

Тогда за $ arrayKeyTwo [array_search ($ одна, $ arrayKeyOne)] shuld дать вам то, что вы хотите. Пусть знают, помогает ли это.

+0

Это не помогло мне, но спасибо. – user367217

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