Lily
Lily

Reputation: 9

How to filter associative array with specific key in PHP?

I'm a newbie in programming. Could anyone please help me with this problem?

After print_r($product) I can get followings: (Sorry for the messy format)

Array ( [product_id] => 1 [sku] => BGM0430 [set] => 9 [type] => simple [categories] => Array ( [0] => 3 [1] => 11 [2] => 14 ) [websites] => Array ( [0] => 1 ) [type_id] => simple [name] => Magical Melody Birthday Card [brand] => 3 [card_number] => XW3M0430 [assortment] => BALASST113 [old_id] => [description] =>
Presidential blue is the background for this happy birthday greeting. A delightful bouquet of multicolored balloons stretches up swirling and dodging little golden stars. "Happy Birthday" is written in large cursive across the front of the card. The message continues at the bottom of the card and says, "To You Happy Birthday." Additional golden foiled stars appear at the sides of the card.

[short_description] =>
Presidential blue is the background for this happy birthday greeting. A delightful bouquet of multicolored balloons stretches up swirling and dodging little golden stars. "Happy Birthday" is written in large cursive across the front of the card. The message continues at the bottom of the card and says, "To You Happy Birthday." Additional golden foiled stars appear at the sides of the card.


Message: Wishing you all the best on this wonderful day and throughout the year ahead.
[verse] => Wishing you all the best on this wonderful day and throughout the year ahead. [card_size] => 7 7/8 x 5 5/8 [card_stock] => 10pt C1S Envirocote 10% PCW LS2467 [url_path] => magical-melody.html [envelope] => Gold Lined White [weight] => 0.0000 [category_ids] => Array ( [0] => 3 [1] => 11 [2] => 14 ) [news_from_date] => [required_options] => 1 [news_to_date] => [has_options] => 1 [status] => 1 [image_label] => Magical Melody Birthday Card, Front [url_key] => magical-melody [visibility] => 4 [small_image_label] => Magical Melody Birthday Card, Front [country_of_manufacture] => [thumbnail_label] => Magical Melody Birthday Card, Front [promotion] => 1 [created_at] => 2013-04-05 17:17:25 [updated_at] => 2013-05-30 15:58:50 [price] => 4.0000 [group_price] => Array ( ) [special_price] => [special_from_date] => [special_to_date] => [tier_price] => Array ( ) [msrp_enabled] => 2 [minimal_price] => [msrp_display_actual_price_type] => 4 [msrp] => [enable_googlecheckout] => 1 [tax_class_id] => 2 [meta_title] => [meta_keyword] => [meta_description] => [is_recurring] => 0 [recurring_profile] => [custom_design] => [custom_design_from] => [custom_design_to] => [custom_layout_update] => [page_layout] => [options_container] => container1 [gift_message_available] => ) Array ( [product_id] => 2 [sku] => BBC23567 [set] => 9 [type] => simple [categories] => Array ( [0] => 6 ) [websites] => Array ( [0] => 1 ) [type_id] => simple [name] => Faint Flourish Anniversary Card [brand] => 3 [card_number] => [assortment] => EAASST613 [old_id] => [description] => This beautiful anniversary card with elegant flourish design is a wonderful way to recognize employees for their years of hard work. [short_description] =>
This beautiful anniversary card with elegant flourish design is a wonderful way to recognize employees for their years of hard work.
Message: Thank you for your hard work and dedication to the team!

[verse] => Thank you for your hard work and dedication to the team! [card_size] => 8 x 4 11/16 [card_stock] => 100lb 30 % PCW [url_path] => faint-flourish-anniversary-card.html [envelope] => plain white envelope [weight] => 0.0000 [category_ids] => Array ( [0] => 6 ) [news_from_date] => 2013-04-05 00:00:00 [required_options] => 1 [news_to_date] => 2013-04-30 00:00:00 [has_options] => 1 [status] => 1 [image_label] => Faint Flourish Anniversary Card - Front [url_key] => faint-flourish-anniversary-card [visibility] => 4 [small_image_label] => Faint Flourish Anniversary Card - Front [country_of_manufacture] => [thumbnail_label] => Faint Flourish Anniversary Card - Front [promotion] => 0 [created_at] => 2013-04-06 05:47:24 [updated_at] => 2013-05-30 15:34:58 [price] => 4.0000 [group_price] => Array ( ) [special_price] => [special_from_date] => [special_to_date] => [tier_price] => Array ( ) [msrp_enabled] => 2 [minimal_price] => [msrp_display_actual_price_type] => 4 [msrp] => [enable_googlecheckout] => 1 [tax_class_id] => 2 [meta_title] => [meta_keyword] => [meta_description] => [is_recurring] => 0 [recurring_profile] => [custom_design] => [custom_design_from] => [custom_design_to] => [custom_layout_update] => [page_layout] => [options_container] => container1 [gift_message_available] => ) Array ( [product_id] => 3 [sku] => BBC23576 [set] => 9 [type] => simple [categories] => Array ( [0] => 10 ) [websites] => Array ( [0] => 1 ) [type_id] => simple [name] => Faint Flourish Get Well [brand] => 3 [card_number] => [assortment] => EAASST613 [old_id] => [description] => This beautiful get well card with elegant flourish design is a wonderful way to share your hopes for a healthier tomorrow. [short_description] =>
This beautiful get well card with elegant flourish design is a wonderful way to share your hopes for a healthier tomorrow.
Message: Sending many warm thoughts and good wishes.

[verse] => Sending many warm thoughts and good wishes. [card_size] => 8 x 4 11/16 [card_stock] => 100lb 30 % PCW [url_path] => faint-flourish-get-well.html [envelope] => plain white envelope [weight] => 0.0000 [category_ids] => Array ( [0] => 10 ) [news_from_date] => 2013-04-05 00:00:00 [required_options] => 1 [news_to_date] => 2013-04-30 00:00:00 [has_options] => 1 [status] => 1 [image_label] => Faint Flouish Get Well Card - Front [url_key] => faint-flourish-get-well [visibility] => 4 [small_image_label] => Faint Flouish Get Well Card - Front [country_of_manufacture] => [thumbnail_label] => Faint Flouish Get Well Card - Front [promotion] => 0 [created_at] => 2013-04-06 05:47:24 [updated_at] => 2013-05-07 22:32:09 [price] => 4.0000 [group_price] => Array ( ) [special_price] => [special_from_date] => [special_to_date] => [tier_price] => Array ( ) [msrp_enabled] => 2 [minimal_price] => [msrp_display_actual_price_type] => 4 [msrp] => [enable_googlecheckout] => 1 [tax_class_id] => 2 [meta_title] => [meta_keyword] => [meta_description] => [is_recurring] => 0 [recurring_profile] => [custom_design] => [custom_design_from] => [custom_design_to] => [custom_layout_update] => [page_layout] => [options_container] => container1 [gift_message_available] => ) 

Data stored in $product and how can I remove other key-value pairs except when the key equals 'sku', 'name', 'price' and 'short_description' which are the information I only want to keep.

The following snippet doesn't work.

foreach($product as $key => $value){
    if($key != 'sku' || $key !='name' || $key != 'price' || $key !='short_description'){
        unset($product[$key]);
    }
}
var_dump($product);

Please let me know how can I fix this and please forgive me if I asked a stupid question.

Any reply or help will be greatly appreciated. Thank you so much in advance.

Upvotes: 0

Views: 359

Answers (3)

Rogier Spieker
Rogier Spieker

Reputation: 4187

An easier to maintain workflow would be to have the keys you want stored in an array of its own and verify each key against that.

$preserve = ['sku', 'name', 'price', 'short_description'];

foreach($product as $key => $value){
    if (!in_array($preserve, $key) {
        unset($product[$key]);
    }
}

Then again, this works if you never - ever - need the other values in the flow of the application, as unset will remove them from the array and cannot be restored (unless you have made a copy of it somewhere).

You seem to want to "shape" the product into a more usable format, which can also be done "the other way around", by creating a new array/object containing only the desired keys.

$preserve.    = ['sku', 'name', 'price', 'short_description'];
$cleanProduct = [];

foreach ($preserve as $key) {
  $cleanProduct[$key] = $product[$key];
}

This is a rather naive approach, as it will nag about keys which don't actually exist in $product, we can fix that in different ways

Only use keys which actually exist

$preserve.    = ['sku', 'name', 'price', 'short_description'];
$cleanProduct = [];

foreach ($preserve as $key) {
  //  test if the product has the key.
  if (isset($product[$key]) {
    $cleanProduct[$key] = $product[$key];
  }
}

Or by assigning a null value for keys which are not in $product, so you ensure all the keys exist but have not actual (significant) value

$preserve.    = ['sku', 'name', 'price', 'short_description'];
$cleanProduct = [];

foreach ($preserve as $key) {
  //  always assign a value, the $product[$key] if it exists, null otherwise
  $cleanProduct[$key] = isset($product[$key]) ? $product[$key] : null;
}

Recent versions of PHP (7+) also support a shorthand version of the assignment:

$cleanProduct[$key] = $product[$key] ?? null;

Upvotes: 0

Gowtham
Gowtham

Reputation: 149

In your code, if condition will be true when any one is not equal. For that you can use switch

foreach($product as $key => $value){
        switch($key){
         case 'sku':
         case 'name':
         case 'price':
         case 'short_description':
         break;

         default:
         unset($product[$key]);
        }
}

In above code, if the any of the key match with the case then it will skip, else if not match with any of the case, it will go to default case and remove it.

Upvotes: 0

trincot
trincot

Reputation: 350137

The boolean logic of that snippet is wrong, as the condition in the if statement will always be true. Instead use the && operator:

    if($key != 'sku' && $key !='name' && $key != 'price'
                     && $key !='short_description'){

You could use the in_array function to make the condition a bit shorter:

if (!in_array($key, ['sku','name','price','short_description']) {

Upvotes: 1

Related Questions