我有一个函数可以在多维数组中搜索键,然后返回路径 在数组内部将我想要的键作为字符串。
有没有什么方法可以在php中使用这个字符串来到我原来的数组中的这个地方,不是为了获得值而是为了更改这个特定的数组bracnch?
一个例子:
$array = array('first_level'=>array(
'second_level'=>array(
'desired_key'=>'value')));
在此示例中,函数将返回字符串:
'first_level => second_level => desired_key'
有没有办法使用此输出,或以不同方式格式化以便以下列或类似方式使用它?
$res = find_deep_key($array,'needle');
$array[$res]['newkey'] = 'injected value';
由于
答案 0 :(得分:1)
如果密钥路径是安全的(例如,未由用户提供),您可以使用eval
并执行以下操作:
$k = 'first_level=>second_level=>desired_key';
$k = explode('=>', $k);
$keys = '[\'' . implode('\'][\'', $k) . '\']';
eval('$key = &$array' . $keys . ';');
var_dump($key);
答案 1 :(得分:0)
我想你想在数组中为你的密钥进行递归搜索?如果我错了,请纠正我。
试试这个
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
从这里采取http://in3.php.net/manual/en/function.array-search.php#91365
答案 2 :(得分:0)
您需要以下内容:
find_key_in_array($key, $array, function($foundValue){
// do stuff here with found value, e.g.
return $foundValue * 2;
});
并且实现类似于:
function find_key_in_array($key, $array, $callback){
// iterate over array fields recursively till you find desired field, then:
...
$array[$key] = $callback($array[$key]);
}
答案 3 :(得分:0)
如果你需要将一些新的子数组附加到多维复杂数组中,并且你知道应该在哪里附加它(你有路径作为字符串),这可能有效(另一种方法没有eval()
):< / p>
function append_to_subarray_by_path($newkey, $newvalue, $path, $pathDelimiter, &$array) {
$destinationArray = &$array;
foreach (explode($pathDelimiter, $path) as $key) {
if (isset($destinationArray[$key])) {
$destinationArray = &$destinationArray[$key];
} else {
$destinationArray[$newkey] = $newvalue;
}
}
}
$res = find_deep_key($array,'needle');
append_to_subarray_by_path('newkey', 'injected value', $res, '=>', $array);
当然,只有当路径中的所有键都已存在时,它才会起作用。否则它会将新的子数组附加到错误的位置。
答案 4 :(得分:-1)
只需编写一个接受字符串和数组的函数。该函数将获取每个数组级别的键,然后返回找到的对象。
如:
void object FindArray(Array[] array,String key)
{
if(key.Length == 0) return array;
var currentKey = key.Split('=>')[0];
return FindArray(array[currentKey], key.Remove(currentKey));
}