[英]Add keys to values that don't already have keys in array PHP
鉴于fallowing数组$array
:
Array
(
[1] => Array
(
[0] => 267
[location_id_keep] => 261
)
[2] => Array
(
[0] => 266
[location_id_keep] => 262
)
[3] => Array
(
[0] => 2669
[1] => 2670
[location_id_keep] => 2668
)
[4] => Array
(
[0] => 266
[1] => 2670
[location_id_keep] => 2668
)
)
我想添加到没有[ location_id_keep
]键的每个数组值的fallowing键:[ location_id_delete
]以便我得到这个输出:
Array
(
[1] => Array
(
[location_id_delete] => 267
[location_id_keep] => 261
)
[2] => Array
(
[location_id_delete] => 266
[location_id_keep] => 262
)
[3] => Array
(
[location_id_delete] => [2669, 2670]
[location_id_keep] => 2668
)
[4] => Array
(
[location_id_delete] => [266, 2670]
[location_id_keep] => 2668
)
)
是否有任何方法可以在分配给没有密钥的现有值的数组中添加键?
这应该有效,但我建议你重新构建数据的结构。 演示
foreach($arrays as &$array){
if($array["location_id_keep"]){
$temp_array["location_id_keep"] = $array["location_id_keep"];
unset($array["location_id_keep"]);
}
$count = count($array);
if($count == 1) {
$temp_array["location_id_delete"] = current($array);
}elseif($count > 1){
$temp_array["location_id_delete"] = array_values($array);
}
$array = $temp_array;
}
您可以尝试使用array_walk()和array_filter() 。 array_filter用于过滤键的数字值(这里的意思是location_id_delete
)。
$array = [[0 => 267, 'location_id_keep' => 261],[0 => 266, 'location_id_keep' => 262],[0 => 2669, 1 => 2670, 'location_id_keep' => 2668], [0 => 266, 1 => 2670, 'location_id_keep' => 2668]];
array_walk($array, function (&$val) {
$val = [
'location_id_delete' => array_filter($val, 'is_numeric', ARRAY_FILTER_USE_KEY),
'location_id_keep' => $val['location_id_keep']
];
});
print_r($array);
工作演示 。
这是片段,
array_walk($arr, function (&$v) {
// keeping location_id_keep aside to perform operation of replacing keys
$temp = array_diff_key($v, ['location_id_keep' => '']);
if (!empty($temp)) {
// getting the count of sub arrays other than location_id_keep
$cnt = count($temp);
foreach ($temp as $key => $value) {
// if one record then directly assign data
if ($cnt == 1) {
$v['location_id_delete'] = $value;
} else{ // assign multiple data in an arrat
$v['location_id_delete'][] = $value;
}
// unset numeric index or other than location_id_keep
unset($v[$key]);
}
}
});
array_walk - 将用户提供的函数应用于数组的每个成员
array_diff_key - 使用密钥计算数组的差异以进行比较
输出: -
Array
(
[1] => Array
(
[location_id_keep] => 261
[location_id_delete] => 267
)
[2] => Array
(
[location_id_keep] => 262
[location_id_delete] => 266
)
[3] => Array
(
[location_id_keep] => 2668
[location_id_delete] => Array
(
[0] => 2669
[1] => 2670
)
)
[4] => Array
(
[location_id_keep] => 2668
[location_id_delete] => Array
(
[0] => 266
[1] => 2670
)
)
)
这将有效
foreach($newArray as $key => $val){
if(array_key_exists('location_id_keep',$val)){
$array[$key]['location_id_keep'] = $val['location_id_keep'];
unset($val['location_id_keep']);
}
$count = count($val);
if($count>1){
$array[$key]['location_id_delete'] = implode(',',$val);
}else{
$array[$key]['location_id_delete'] = $val[0];
}
}
OUTPUT
Array
(
[1] => Array
(
[location_id_keep] => 261
[location_id_delete] => 267
)
[2] => Array
(
[location_id_keep] => 262
[location_id_delete] => 266
)
[3] => Array
(
[location_id_keep] => 2668
[location_id_delete] => 2669,2670
)
[4] => Array
(
[location_id_keep] => 2668
[location_id_delete] => 266,2670
)
)
功能解决方案
foreach($arrays as &$array){
// get numeric key items
$temp = array_filter($array, 'is_numeric',ARRAY_FILTER_USE_KEY);
// remove them from array and return under new key
$array = array_diff($array, $temp) + ['location_id_delete'=>$temp];
}
你可以使用foreach
with implode
和unset
foreach($a as $k => &$v){
$location = $v['location_id_keep'];
unset($v['location_id_keep']);
$r[] = [
'location_id_delete' => implode(',',$v),
'location_id_keep' => $location
];
}
实例: https : //3v4l.org/kqCVH
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.