繁体   English   中英

检查具有不同键的数组?

[英]Check Arrays with different keys?

如何检查特定的阵列键是否存在以及如何比较它们?

1.数组看起来像这样。

[33] => Array
               (
                   [211] =>objectr
                       (
                           [name] => Test
                           [id]=>  211
                    )
               )

[23] => Array
               (
                   [311] =>objectr
                       (
                           [name] => Tester
                           [id]=>  311
                    )
               )

2.数组看起来像这样

   [0] => 311
   [1] => 211
   [2] => 99

现在,我需要比较它们并获取它们的ID。

我正在寻找的是这样的东西

   [0] => Tester
   [1] => Test

我怎么做?

我将对数组1进行转换,就像删除外键一样(至少是暂时地),然后在遍历数组2的过程中,将使用array_key_exists与经过转换的数组1进行比较。

array_key_exists - http://php.net/manual/zh/function.array-key-exists.php

foreach($first_array as $arr) {
    foreach($second_array as $key=>$val)
    {
        if (array_key_exists($val, $first_array)) {
            $final_array[$key] = $arr['name'];
        }
    }
}

array_search - http: array_search

foreach($first_array as $arr) {
    foreach($second_array as $val)
    {
        $key = array_search($val, $arr);
        if($key !== false) $final_array[$key] = $arr['name'];
    }
}

在两种情况下,您都应该得到:

   [0] => Tester
   [1] => Test

希望我能理解您的问题,可能会有语言障碍,但是我们开始:

因此,基本上,您有3个数组,并且要使用后一个数组来检查第一个数组,以查看第一个数组中是否存在这些值/键? 首先,您要做的是将第一个数组重新构造为可以轻松转换以检查下两个数组的值和键的内容。 因此,让我们调用第一个数组$ mapArray:

foreach($mapArray as $mapObject){
    foreach($mapObject as $object){
        $mapList[$object->id] = $object->name;
    }
}

现在,这应该给我们类似的东西:

[211] => 'test'
[311] => 'tester'

现在,让我们调用第二个数组$ arrayIds和第三个$ arrayNames。 要查看id是否存在并在给定数组$ arrayIds时获取其名称,您需要做的是:

//given [0] => 311
$keyExists = array_key_exists(311, $mapList); //returns true is the key exists
echo $mapList[311]; //returns tester, the name for the id given

反过来:

//given [0] => 'test'
$nameExists = in_array('test', $mapList);
if($nameExists) echo array_search('test', $mapList); // returns 211

希望这就是您要寻找的东西,或者至少可以帮助您找到想要的东西。

另一种方法:我们将第一个数组缩小为一个维:

$first = array();

foreach($first_array as $val) {
   $first[key($val)] = current($val);
}

给出:

Array
(
    [211] => Array
        (
            [name] => Test
            [id] => 211
        )

    [311] => Array
        (
            [name] => Tester
            [id] => 311
        )

)

(我使用数组而不是对象,但是它的作用相同)。

然后我们计算关键点的交集:

//assume
$second_array = array(311, 99);

$result = array_intersect_key($first, array_flip($second_array));

这使:

Array
(
    [311] => Array
        (
            [name] => Tester
            [id] => 311
        )

)

因此,这并不是您想要的,但是您可以通过$element->name轻松访问name属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM