2016-12-10 2 views
0

Я новичок в программировании. Может ли кто-нибудь помочь мне с этой проблемой?Как фильтровать ассоциативный массив с определенным ключом в PHP?

После print_r($product) я могу получить следующее: (Извините за грязный формат)

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] =>) 

Данные хранятся в $product и как я могу удалить другие пары ключ-значение, за исключением, когда ключ равно, «имя«ы» ',' price 'и' short_description ', которые я хочу сохранить.

Следующий фрагмент не работает.

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

Пожалуйста, дайте мне знать, как я могу исправить это и, пожалуйста, простите меня, если я задам глупый вопрос.

Любой ответ или помощь будут очень признательны. Огромное спасибо заранее.

+1

_Can Я использую следующий фрагмент? _ - Вы уже попробовали? – Federkun

+1

'if (in_array ($ key, array ('sku', 'name', 'price', 'short_description')) === false) {unset ($ product [$ key]);}' –

+0

@Federkun I но это не сработало. Благодарим вас за редактирование. – Lily

ответ

1

Логическая логика этого фрагмента неверна, так как условие в операторе if всегда будет истинным. Вместо того, чтобы использовать && оператор:

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

Вы можете использовать функцию in_array сделать состояние немного короче:

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

Большое вам спасибо за помощь! – Lily

0

В вашем коде, если условие будет верным, если какой-либо один не равен. Для этого вы можете использовать переключатель

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

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

В коде выше, если какой-либо из ключевых матча с делом, то он будет пропускать, иначе, если не совпадает ни с одним из дела, он будет идти по умолчанию дело и удалить Это.

+0

Большое вам спасибо за помощь! – Lily

0

Простым в обслуживании рабочим процессом было бы иметь ключи, которые вы хотите хранить в собственном массиве, и проверять каждый ключ на это.

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

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

Тогда снова, это работает, если вы никогда - никогда - не нужны другие ценности в потоке приложения, как unset удалит их из массива и не может быть восстановлен (если вы не сделали копию где-то).

Вы, кажется, хотите «сформировать» продукт в более удобный формат, который также может быть выполнен «по-другому», создав новый массив/объект, содержащий только нужные ключи.

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

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

Это довольно наивный подход, так как он будет ворчать о ключах, которые на самом деле не существуют в $product, мы можем исправить это по-разному

использовать только ключи, которые на самом деле существуют

$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]; 
    } 
} 

Или присвоение нулевого значения для ключей, которые не находятся в $product, так что вы обеспечить наличие всех ключей, но не реально (существенное) значение

$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; 
} 

Последние версии PHP (7+) также поддерживают сокращенную версию задания:

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

+0

Большое вам спасибо за помощь! – Lily