繁体   English   中英

将键添加到数组PHP中尚未包含键的值

[英]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 implodeunset

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM