PHP - 在多维数组中搜索键,并从结构中更深入地获取其值

时间:2017-12-29 09:43:22

标签: php arrays

我正在检查特定值是否作为数组中的键存在,我需要执行以下操作 - 如果它存在以收集一些数据。这是一种情况:

$valueCode;  //(it can be EV000005, EV000010, etc.)
$temp = array_key_exists_custom($valueCode,$v); //does valueCode exist in array $v

//If it exist I need to collect it is value deeper from structure 
//For example, for EV000005 -> I want to get 'Thread holding'

if ($temp) {
$colValue; // after perfroming code, $colValue should have value  'Thread holding'
}

如果我的结构只有EV000005,我会这样做并获得价值。

$colValue = $v[0][$valueCode][0][0][1];

但这对我来说不是解决方案,因为有时我的价值不在$v[0],即f.e。当我们搜索EV000010时,它会在$v[1][$valueCode][0][0][1];中。我不知道获得这个价值的最佳方法是什么。

数组示例:

    Array
(
    [0] => Array
        (
            [EV000005] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => EN
                                    [1] => Thread holding
                                )

                            [1] => Array
                                (
                                    [0] => nl-NL
                                    [1] => Schroefdraadhouder
                                )

                        )

                )

        )

    [1] => Array
        (
            [EV000010] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => EN
                                    [1] => Desoldering iron
                                )

                            [1] => Array
                                (
                                    [0] => nl-NL
                                    [1] => Desoldeerbout
                                )

                        )

在数组中搜索的功能

function array_key_exists_custom($needle, $haystack){
            $result = array_key_exists($needle, $haystack);
            if ($result) {
                return $result;
            }

            foreach ($haystack as $v) {
                if (is_array($v)) {
                    $result = array_key_exists_custom($needle, $v);
                }
                if ($result) {
                    return $result;
                }

            }
            return $result;
        }

3 个答案:

答案 0 :(得分:1)

将array_key_exists_custom更改为返回值,以这种方式找到关键点:

$result = array_key_exists($needle, $haystack); 
if ($result) { return $haystack[$needle]; }

通过

获得结果
$res = array_key_exists_custom($key, $arr)[0][0][1];

答案 1 :(得分:0)

使用函数is_array()使数组的每个元素更“深入”

答案 2 :(得分:0)

我对这个问题的描述有点挣扎 - 我推断你想要在命名键下面找到数据(例如EV000005),但你不知道这个键在顶级数组中的位置

这看起来像XY problem。之所以出现这种困难是因为您感兴趣的键不是顶级数组的键。如果您的初始数据结构是....

    Array (
        [EV000005] => Array
            (
                [0] => Array
                    (
                        [0] => Array
                            (
                                [0] => EN
                                [1] => Thread holding
                            )
                        [1] => Array
                            (
                                [0] => nl-NL
                                [1] => Schroefdraadhouder
                            )
                    )
            )
        [EV000010] => Array
            (
                [0] => Array
                    (
                        [0] => Array
                            (
                                [0] => EN
                                [1] => Desoldering iron
                            )
                        [1] => Array
                            (
                                [0] => nl-NL
                                [1] => Desoldeerbout
                            )
                    )

...那么我们就不会进行这种对话了。你只需要使用

$colValue = $v['EV000005'][0][0][1];

根据您提供的(确实稀少的)信息,没有理由使用第一级单元素数组,这会让您的生活变得更加困难。

查看更深层次的数据,这种反模式重复,您的数据应更正确:

         Array (
        [EV000005] => Array
            (
                [EN] => Thread holding
                [nl-NL] => Schroefdraadhouder
            )
        [EV000010] => Array
            (
                [EN] => Desoldering iron
                [nl-NL] => Desoldeerbout
            )

您的代码的另一个问题是您正在使用PHP执行数据过滤操作。数据不是源自PHP - 它应该存储在数据库中。您应该在数据库中进行过滤和排序,而不是在PHP中。

现在假设,有一个非常非常良好的理由,您无法正确解决问题,唯一解决方案是应用您的方法....

 function retrieve_description($item, $lang, &$arr)
 {
     foreach ($arr as $record) {
        if (is_array($record[$item])) {
           foreach ($record[$item] as $description) {
              if ($description[0]==$lang) return $description[1];
           }
           return false;
        }
     }
     return false;
 }

停止为已有标识符的内容分配随机数。