我想通过比较两个索引从嵌套关联数组中删除

时间:2019-04-21 07:17:17

标签: php

我有两个关联数组,然后我想将两个索引与状态进行比较,如果状态被删除,则必须删除整行。

我已经尝试了这段代码,但是它给了我一些错误。我必须比较$employee$employee_status数组的索引以及状态$employee_status,如果状态为Delete,然后我必须从$employee数组中删除整行

$employee = array
(
0=>
    array("employee_id"=>1, "firstName"=>"Zahir", "lastName"=>"Alam", "Age"=>25, "Company"=>"Switchme", "Role"=>"Developer", "Department"=>"Tech"
        ,"Head"=>
            array("Id"=>3 , "Name"=>"Sourasis Roy")
    )
,
1=>
    array("employee_id"=>2, "firstName"=>"Amith", "lastName"=>"Manniken", "Age"=>25, "Company"=>"Switchme", "Role"=>"Developer", "Department"=>"Tech"
        ,"Head"=>
            array("Id"=>3 , "Name"=>"Sourasis Roy")
    )
,
2=>
    array("employee_id"=>3, "firstName"=>"Sourasis", "lastName"=>"Roy", "Age"=>28, "Company"=>"Switchme", "Role"=>"CTO")
,
3=>
    array("employee_id"=>4, "firstName"=>"Aditya", "lastName"=>"Mishra", "Age"=>29, "Company"=>"Switchme", "Department"=>"Tech", "Role"=>"CEO")
,
4=>
    array("employee_id"=>5, "firstName"=>"Priti", "lastName"=>"Lata", "Age"=>24, "Company"=>"Switchme", "Role"=>"HR")
,
5=>
    array("employee_id"=>6, "firstName"=>"Sumita", "lastName"=>"Nath", "Age"=>24, "Company"=>"Switchme", "Role"=>"HLA Head", "Department"=>"Crm")
,
6=>
    array("employee_id"=>7, "firstName"=>"Tarini", "lastName"=>"Khanna", "Age"=>22, "Company"=>"Switchme", "Role"=>"Content Writer")
,
7=>
    array("employee_id"=>8, "firstName"=>"Abhisek", "lastName"=>"Soni", "Age"=>23, "Company"=>"Switchme", "Role"=>"HLA", "Department"=>"Crm","Head"=>array("Id"=>5 , "Name"=>"Sumita Nath")
    )
,
8=>
    array("employee_id"=>9, "firstName"=>"Ankit", "lastName"=>"Pump", "Age"=>23, "Company"=>"Switchme", "Role"=>"HLA", "Department"=>"Crm"
        ,"Head"=>
            array("Id"=>5 , "Name"=>"Sumita Nath")
    )
,
9=>
    array("employee_id"=>10, "firstName"=>"Pogo", "lastName"=>"Laal", "Age"=>23, "Company"=>"Switchme", "Role"=>"Designer")
,
10=>
    array("employee_id"=>11, "firstName"=>"Sabina", "lastName"=>"Sekh", "Age"=>28, "Company"=>"Switchme", "Role"=>"HLA Head", "Department"=>"Crm")
,
11=>
    array("employee_id"=>12, "firstName"=>"Sanjay", "lastName"=>"Poudal", "Age"=>24, "Company"=>"Switchme", "Role"=>"HLA Head", "Department"=>"Crm"
        ,"Head"=>
            array("Id"=>10 , "Name"=>"Sabina Sekh")
    )
,
);

$employee_status = array
(
1=>
    array("employee_id"=>1, "status"=>"Active"
    )
,
7=>
    array("employee_id"=>2, "status"=>"Delete"
    )
,
11=>
    array("employee_id"=>11, "status"=>"Delete"
    )
,
10=>
    array("employee_id"=>10, "status"=>"Active"
    )
,
);
    foreach($employee as &$emp1){
    foreach($employee_status as $emp2){
        if($emp1['employee_id'] == $emp2['employee_id'] && $emp2["status"]=="Delete"){
            unset($emp1['employee_id']);
        }
    }
}
foreach($employee as $eee)
{
    print_r($eee);
}

4 个答案:

答案 0 :(得分:0)

尝试这样:

foreach($employee as $k => $emp1){
    foreach($employee_status as $emp2){
        if($emp1['employee_id'] == $emp2['employee_id'] && $emp2["status"]=="Delete"){
                unset($employee[$k]);
        }
    }
}

我认为问题在于您迭代并通过引用(&sign)使用了数组以同时取消设置元素。

答案 1 :(得分:0)

这使用$employee_status数组的键来标识员工,为此,我将第二个键7=>更正为2=>。然后,您可以只使用employee数组中的employee_id来找到相应的状态。还使用employee数组的索引从数组中删除项目...

$employee_status = array
(
    1=>
    array("employee_id"=>1, "status"=>"Active"
    )
    ,
    2=>
    array("employee_id"=>2, "status"=>"Delete"
    )
    ,
    11=>
    array("employee_id"=>11, "status"=>"Delete"
    )
    ,
    10=>
    array("employee_id"=>10, "status"=>"Active"
    )
    ,
);
foreach($employee as $index => $emp1){
    if(isset($employee_status[$emp1['employee_id']]) 
            && $employee_status[$emp1['employee_id']]["status"]=="Delete"){
        unset($employee[$index]);
    }
}

如果无法直接更改$employee_status数组,则可以使用array_column()

以employee_id作为索引重新创建它。
$employee_status = array_column($employee_status, null, "employee_id");

您也可以使用array_filter(),但是恕我直言,此解决方案非常简单。但是为了完整性...

$employee_status = array_column($employee_status, null, "employee_id");
$employee = array_filter($employee, function ($emp) use ($employee_status){
    return (!isset($employee_status[$emp['employee_id']])
        || $employee_status[$emp['employee_id']]["status"]!="Delete");
});

答案 2 :(得分:0)

您可以简单地使用array_walk

$keepActive = [];
$empStatus = array_column($employee_status, 'status','employee_id');

array_walk($employee, function($v, $k) use ($empStatus, &$keepActive){
  $condition = array_key_exists($v['employee_id'], $empStatus) && ($empStatus[$v['employee_id']] == 'Delete');
  if(!$condition)
    $keepActive[$k] = $v;
});

答案 3 :(得分:-1)

$employee_status_col = array_column($employee_status, 'employee_id');

foreach($employee as $emp_key => $emp_row){
   $employee_id = $emp_row['employee_id'];

   $key = array_search($employee_id, $employee_status_col);

   if($key !== false){
      $status = $employee_status[$key]['status'];

      if($status == 'Delete'){
          //remove from the array
          unset($employee[$emp_key])
      }
   }
}