【问题标题】:PHP: get keys of independent arraysPHP:获取独立数组的键
【发布时间】:2011-03-08 05:09:15
【问题描述】:

我有两个数组。

第一个数组示例:

$arrayOne = 数组 ( '水果' => 数组( '苹果' => 数组(), '橘子' => 数组(), '香蕉' => 数组() ), '蔬菜' => 数组( '西红柿' => 数组(), '胡萝卜' => 数组(), '芹菜' => 数组(), '甜菜' => 数组 ( '熊' => 数组(), '战星-卡拉狄加' => 数组() ), ), '肉' => 数组(), '其他' => 数组() );

第二个:

$arrayTwo = 数组 ( 'frewt' => 数组( 'aplz' => 数组(), 'orangeez' => 数组(), 'bunanahs' => 数组() ), 'vetchteblz' => 数组( 'toem8ohs' => 数组(), 'careodds' => 数组(), 'sell-R-e' => 数组(), '节拍' => 数组 ( '裸 z' => 数组(), 'tablestar-neglectia' => 数组() ), ), '整洁' => 数组(), '母亲' => 数组() );

请注意,这两个数组具有完全相同的“格式”(相同的维数、键数、顺序等),只是键的名称不同。 (数组键基本上保存了所有数据。)

我有一些变量用于处理第一个数组 ($arrayOne) 的键。例如。 $one 将处理第一个数组的第一个维度,因此它的值(字符串)将是 'fruit''vegetables''meat''other' 中的一个。
$two 将是 @987654328 @ 或'oranges''bananas''tomatoes''carrots' 等等,你懂的。 (每个维度都有变量)
正如我所说,这些变量只针对$arrayOne。不过,我也希望能够处理第二个数组中的键。意思是,通过查看$one 的值,我希望能够获得两个数组的array_key。

【问题讨论】:

  • 第一个数组中数组键多次出现的情况,你想如何处理?
  • 没关系,因为相同的键将转换为第二个数组中的相同键。例如。两次关键的“橙子”也将在第二个数组中出现两次,如“橙子”。我只需要第二个数组的相应键的字符串。
  • 好的,我的解决方案在找到第一个键后停止搜索,但修改返回所有键的位置很简单。

标签: php arrays multidimensional-array key


【解决方案1】:
$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)));

给予:

数组(3){ [0]=> 整数(1) [1]=> 整数(3) [2]=> 整数(1) } string(19) "tablestar-neglectia"

您可以将getPosition 的结果提供给getElementKey

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

【讨论】:

  • 谢谢,但我不确定这有什么帮助?也不会有“here”值,而是一个空数组。
  • @tsha 如果您需要键而不是值,请将return current($cur) 替换为return key($cur)。然后getElement($arrayTwo, getPosition($arrayOne, "battlestar-galactica")); 会给'tablestar-neglectia'
  • 谢谢,但我无法让它工作。你能编辑你的帖子并给我看吗?也许甚至测试它?会很好!谢谢。
  • 这确实有效,但是我发现当我达到大于 2 的深度时,这意味着顶层的下一个元素被复制了。但是添加第二个 array_pop($pos);在它已经完成的位置之下,它似乎可以解决所有问题!感谢您的解决方案,虽然节省了我的时间!
【解决方案2】:

从两个数组中检查array_keys,然后映射位置。就像你的数组的 array_keys 会给你 -

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

然后 $arrayKeyTwo[array_search($one, $arrayKeyOne)] 应该给你你想要的。让我们知道这是否有帮助。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 2011-08-10
    • 2012-02-02
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    相关资源
    最近更新 更多