我有一个PHP生成的数组
array(
array(
'name'=>'node1',
'id' => '4'
),
array(
'name'=>'node2'
'id'=>'7'
)
)
我正在尝试将数组添加到特定的id(所以让我们说id 4)
'children'=>
array(
array('name'=>'node2','id'=>'5'),
array('name'=>'node3','id'=>'6')
)
那么它看起来像
array(
array(
'name'=>'node1',
'id' => '4'
'children'=>
array(
array('name'=>'node2','id'=>'5'),
array('name'=>'node3','id'=>'6')
)
),
array(
'name'=>'node2'
'id'=>'7'
)
)
但我似乎无法找到一种搜索多维数组的方法,并为该数组添加一个多维数组。
任何帮助?
答案 0 :(得分:2)
使用foreach
循环遍历数组(确保获取密钥),检查值,添加(如果需要)并在找到时中断。
foreach($array as $k=>$v) {
if( $v['id'] == 4) {
$array[$k]['children'] = array(...);
break;
}
}
答案 1 :(得分:0)
foreach($a as $k => $v)
{
if(is_array($v))
{
foreach($v as $ke => $va)
{
if($ke == 'children')
{
......
}
}
}
}
答案 2 :(得分:0)
这是一个怪物,但它做你想要的。在递归函数中使用push失败,因为引用在第二次函数调用后被销毁,所以如果你不知道密钥的深度,可以选择使用任意数量的循环并希望获得最佳的导入变量和使用eval用于推送新值,或拆分和重建阵列。我选择了eval。您想要的描述与推送值略有不同,因为您在数组中寻找键值对,而不是数组。此函数查找键值对并添加您想要的任何兄弟,如果未指定任何值,则将该值作为兄弟添加到匹配的第一个键。如果没有指定pushval,它将返回指向匹配键/键值的键链。
$ref_array
是要修改的多数组,
$key
是您正在寻找的关键,
$val
是您要查找的密钥的值,
$newkey
是引用新值的新密钥,
$pushval
是由$newkey
编制索引的新值。
不要传递$val_array
参数的参数。它仅用于重复呼叫。它是函数区分新调用和递归调用的方式,它是函数在不中断传递引用的情况下查找键值的方式。
function deepPush(&$ref_array, $key, $val=null, $newkey=null, $pushval=null, $val_array=null)
{
static $r, $keys;
#reset static vars on first call
if(!$val_array){ $r = 0; $keys = array();}
#cap recursion
if($r > 100){ trigger_error('Stack exceeded 100'); return;}
#init val_array
$val_array = ($r) ? $val_array : $ref_array;
#specified search value???
$search_val = ($val!==null && !in_array($val, $val_array)) ? true : false;
if(!array_key_exists($key, $val_array) || $search_val) {
$i=0;foreach($val_array as $k=>$v){
if(gettype($v) == 'array') {
if($i>0){/*dead-end*/array_pop($keys); /*keep recusion accurate*/$r-=$i;}
$keys[] = $k;/*build keychain*/
$r++; $i++; /*increment recursion, iteration*/
if(deepPush($ref_array, $key, $val, $newkey, $pushval, $v)){ /*close stack on 1st success*/return $keys;}
}//if
}//foreach
}//if
else{
if($pushval === null){return $keys;}
#add $newkey to the keychain
$keys[] = $newkey;
#process $pushval based on type
$pushval = (gettype($pushval) == 'string') ? sprintf("'%s'", $pushval) : var_export($pushval, true);
#link keys together to form pointer
$p = '$ref_array';
for($j=0,$c=count($keys); $j<$c; $j++) {
$k = $keys[$j];
$p .= "['$k']";
}//for
#concat the value to be pushed
$p .= sprintf("= %s;",$pushval);
#push it
eval($p);
$keys = array();
return true;
}//else
}
deepPush($array, 'id', 4, 'children', $addThis);