PHP Remove elements from associative array

后端 未结 9 1324
一整个雨季
一整个雨季 2020-12-01 06:09

I have an PHP array that looks something like this:

Index              Key     Value
[0]                1       Awaiting for Confirmation
[1]                        


        
相关标签:
9条回答
  • 2020-12-01 06:18

    I kinda disagree with the accepted answer. Sometimes an application architecture doesn't want you to mess with the array id, or makes it inconvenient. For instance, I use CakePHP quite a lot, and a database query returns the primary key as a value in each record, very similar to the above.

    Assuming the array is not stupidly large, I would use array_filter. This will create a copy of the array, minus the records you want to remove, which you can assign back to the original array variable.

    Although this may seem inefficient it's actually very much in vogue these days to have variables be immutable, and the fact that most php array functions return a new array rather than futzing with the original implies that PHP kinda wants you to do this too. And the more you work with arrays, and realize how difficult and annoying the unset() function is, this approach makes a lot of sense.

    Anyway:

    $my_array = array_filter($my_array, 
                             function($el) { 
                                return $el["value"]!="Completed" && $el!["value"]!="Marked as Spam"; 
                             });
    

    You can use whatever inclusion logic (eg. your id field) in the embedded function that you want.

    0 讨论(0)
  • 2020-12-01 06:20

    You can use this

    unset($dataArray['key']);
    
    0 讨论(0)
  • 2020-12-01 06:20

    The way to do this to take your nested target array and copy it in single step to a non-nested array. Delete the key(s) and then assign the final trimmed array to the nested node of the earlier array. Here is a code to make it simple:

    $temp_array = $list['resultset'][0];
    
    unset($temp_array['badkey1']);
    unset($temp_array['badkey2']);
    
    $list['resultset'][0] = $temp_array;
    
    0 讨论(0)
  • 2020-12-01 06:22

    Your array is quite strange : why not just use the key as index, and the value as... the value ?

    Wouldn't it be a lot easier if your array was declared like this :

    $array = array(
        1 => 'Awaiting for Confirmation', 
        2 => 'Asssigned', 
        3 => 'In Progress', 
        4 => 'Completed', 
        5 => 'Mark As Spam', 
    );
    

    That would allow you to use your values of key as indexes to access the array...

    And you'd be able to use functions to search on the values, such as array_search() :

    $indexCompleted = array_search('Completed', $array);
    unset($array[$indexCompleted]);
    
    $indexSpam = array_search('Mark As Spam', $array);
    unset($array[$indexSpam]);
    
    var_dump($array);
    

    Easier than with your array, no ?



    Instead, with your array that looks like this :

    $array = array(
        array('key' => 1, 'value' => 'Awaiting for Confirmation'), 
        array('key' => 2, 'value' => 'Asssigned'), 
        array('key' => 3, 'value' => 'In Progress'), 
        array('key' => 4, 'value' => 'Completed'), 
        array('key' => 5, 'value' => 'Mark As Spam'), 
    );
    

    You'll have to loop over all items, to analyse the value, and unset the right items :

    foreach ($array as $index => $data) {
        if ($data['value'] == 'Completed' || $data['value'] == 'Mark As Spam') {
            unset($array[$index]);
        }
    }
    var_dump($array);
    

    Even if do-able, it's not that simple... and I insist : can you not change the format of your array, to work with a simpler key/value system ?

    0 讨论(0)
  • 2020-12-01 06:34
      ...
    
      $array = array(
          1 => 'Awaiting for Confirmation', 
          2 => 'Asssigned', 
          3 => 'In Progress', 
          4 => 'Completed', 
          5 => 'Mark As Spam', 
      );
    
    
    
      return array_values($array);
      ...
    
    0 讨论(0)
  • 2020-12-01 06:37

    Why do not use array_diff?

    $array = array(
        1 => 'Awaiting for Confirmation', 
        2 => 'Asssigned', 
        3 => 'In Progress', 
        4 => 'Completed', 
        5 => 'Mark As Spam', 
    );
    $to_delete = array('Completed', 'Mark As Spam');
    $array = array_diff($array, $to_delete);
    

    Just note that your array would be reindexed.

    0 讨论(0)
提交回复
热议问题