我有一个数组,比如说
$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}
,但这还不够
答案 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);
}
}