更深入的数组元素(嵌套)

时间:2015-12-03 07:47:56

标签: php arrays

我有一个数组,比如说

$current_file_data=
['step1'=>
         ['step2'=1]
]

我想要一个简单的函数,它需要一个字符串,并简单地传递这个数组的更深层元素,比如说:

function deeper_element($path,$array) {

return $array{$path};

}

所以如果使用

$current_file_data

我会使用deeper_element('['step1']['step2']',$current_file_data)

并从中返回1(参见上面的数组)

我简单地尝试了$array{$path},但这还不够

4 个答案:

答案 0 :(得分:1)

我认为没有动态功能。请检查用于声明数组的语法。

<?php
$data=array(
'step1'=>array(
    'step2'=>1
    )
);
function get_deep($path,$data){
$path=explode(',',$path);
return $data[$path[0]][$path[1]];
}
echo get_deep("step1,step2",$data);
?>

这将导致1作为输出。 如果你想访问文件内容,在这种情况下json文件你可以像这样创建数组

$data=json_decode(filestream,true);

答案 1 :(得分:1)

假设您的$path是一个字符串,其中包含由分隔符分隔的键。例如,如果您的分隔符为/,则为

的示例
a/b/c/d

意味着$array["a"]["b]["c"]["d"]

让我们看看功能:

function getInnerArray($array, $path, $separator = "/") {
    $keys = explode($separator, $path);
    $temp = $array;
    for ($keys as $key) {
        if (isset($temp[$key])) {
            $temp = $temp[$key];
        } else {
            return null;
        }
    }
    return $temp;
}

说明:分隔符可以是您喜欢的任何内容,但为了简单起见,我已经定义了一个默认值。使用分隔符将触发一系列键。 temp被初始化为数组,循环遍历键。在每个步骤中,如果存在,temp将刷新到由key找到的内部元素。如果不是,则路径无效并返回null。

答案 2 :(得分:0)

    <?php

        function array_keys_multi(array $array)
            {
                $keys = array();

                foreach ($array as $key => $value) {
                    $keys[] = $key;

                    if (is_array($array[$key])) {
                        $keys = array_merge($keys, array_keys_multi($array[$key]));
                    }
                }

                return $keys;
            }

        $current_file_data = array('step1' => array('step2'=>1));

        $arr_keys = array_keys_multi($current_file_data);

        if( in_array('step2', $arr_keys) )
            echo "FOUND";

    ?>

答案 3 :(得分:0)

感谢鼓舞人心的反馈。但是我让它做了以下工作:

类别:

    <?php


namespace App\Tools\Arrays;


class DeepArrayExtractor
{

    /**
     * if path to deeper array element exists, return it
     * otherwise return the complete original array
     * @param array $deepArray
     * @param $pathBitsString
     * @param $separator
     * @return array
     */
    public static function deeperArrayElement(array $deepArray, $pathBitsString, $separator)
    {

        $currentArray = $deepArray;
        $pathBits = explode($separator, $pathBitsString);
        foreach ($pathBits as $bit) {
            if (isset($currentArray[$bit])) {
                $deepArrayElement = $currentArray[$bit];
                $currentArray = $deepArrayElement;
            } else {
                return $deepArray;
            }
        }
        return $deepArrayElement;
    }
}

和单元测试

<?php


namespace App\Tools\Arrays;


class DeepArrayExtractorTest extends \TestCase
{


    public function setUp()
    {
        parent::setUp();
    }

    public function tearDown()
    {
        parent::tearDown();
    }


    /**
     * @test
     * @group DeepArrayExtractorTest1
     */
    public function getDeepArrayCorrectly()
    {
        $deepArray = [
            'step1' =>
                ['step2' => 1]
        ];
        $separator = '---';
        $path = 'step1---step2';
        $deepArrayElement = DeepArrayExtractor::deeperArrayElement($deepArray, $path, $separator);
        $this->assertEquals(1, $deepArrayElement);
    }

    /**
     * @test
     * @group DeepArrayExtractorTest2
     */
    public function deepArrayDoesNotExistSoOriginalArrayReturned()
    {
        $deepArray = [
            'step1' =>
                ['step3' => 1]
        ];
        $separator = '---';
        $path = 'step1---step2';
        $deepArrayElement = DeepArrayExtractor::deeperArrayElement($deepArray, $path, $separator);
        $this->assertEquals($deepArray, $deepArrayElement);
    }

}