PHP: получить ключи независимых массивов - PullRequest
3 голосов
/ 25 июня 2010

У меня есть два массива.

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

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

второй:

$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, я хочу получить ключ массива обоих массивов.

Ответы [ 2 ]

4 голосов
/ 25 июня 2010
$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 голосов
/ 25 июня 2010

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

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

Тогда $ arrayKeyTwo [array_search ($ one, $ arrayKeyOne)] даст вам то, что вы хотите.Дайте знать, если это поможет.

...