Как удалить все указанные c ключи из ассоциативного массива PHP - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно сбросить все «приоритетные» ключи и значения из ассоциативного массива, как показано ниже. Не удалось найти решение для этого.

Как вы думаете, какой метод является лучшим для удаления указанной пары ключей-значений c из всего массива?

$countries = array(
    'AE' => array(
        'postcode' => array(
          'required' => false,
          'hidden'   => true,
          'priority' => 40,
        ),
        'city' => array(
            'priority' => 50,
        ),
    ),
    'AF' => array(
        'state' => array(
            'priority' => 65,
        ),
    ),
    'AO' => array(
        'postcode' => array(
            'required' => false,
            'hidden'   => true,
        ),
        'state'    => array(
            'label' => __( 'Province', 'woocommerce' ),
            'priority' => 70,
        ),
    ),
    // + another arrays
);

РЕДАКТИРОВАТЬ

Решение, которое я нашел:

foreach( $countries as $country => $fields ) {
    foreach( $fields as $field => $options ) {
        if ( isset( $options['priority'] ) ) {
            unset( $countries[$country][$field]['priority'] );
        }
    }
}

Но я все еще задаюсь вопросом, есть ли другие лучшие варианты с меньшим количеством написанного кода, возможно, некоторые предопределенные функции.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2020
<?php
$countries = array(
    'AE' => array(
        'postcode' => array(
          'required' => false,
          'hidden'   => true,
        ),
        'state'    => array(
            'priority' => 50,
        ),
    ),
    'AF' => array(
        'state' => array(
            'priority' => 65,
        ),
    ),
    'AO' => array(
        'postcode' => array(
            'required' => false,
            'hidden'   => true,
        ),
        'state'    => array(
            'label' => ['Province', 'woocommerce'],
            'priority' => 70,
        ),
    ),
    // + another arrays
);

function unset_recursive(&$array, $key) {
    unset($array[$key]);
    foreach ($array as &$value) {
        if (is_array($value)) {
            unset_recursive($value, $key);
        }
    }
}

unset_recursive($countries, 'priority');
var_dump($countries);
0 голосов
/ 11 февраля 2020

Пожалуйста, попробуйте это, этот код может искать глубину 2.

<?php
$countries = array(
    'AE' => array(
        'postcode' => array(
          'required' => false,
          'hidden'   => true,
        'priority' => 50,
        ),
        'state'    => array(
            'priority' => 50,
        ),
    ),
    'AF' => array(
        'state' => array(
            'priority' => 65,
        ),
    ),
    'AO' => array(
        'postcode' => array(
            'required' => false,
            'hidden'   => true,
        ),
        'state'    => array(
            'label' => ['Province', 'woocommerce'],
            'priority' => 70,
        ),
    ),
    // + another arrays
);

$lookKey = 'priority';
foreach($countries as $key => $country) {

    if(array_key_exists($lookKey, $country)){
        //echo "\n $key - $lookKey";
        unset($countries[$key][$lookKey]);
    }else{
        foreach($country as $subKey => $ar){    
            if(array_key_exists($lookKey, $ar)){
                //echo "\n $key - $subKey - $lookKey";
                unset($countries[$key][$subKey][$lookKey]);
            }
        }
    }


}

print_r($countries);

Надеюсь, это поможет вам.

0 голосов
/ 11 февраля 2020
<?php
$countries = array(
    'AE' => array(
        'postcode' => array(
          'required' => false,
          'hidden'   => true,
        ),
        'state'    => array(
            'priority' => 50,
        ),
    ),
    'AF' => array(
        'state' => array(
            'priority' => 65,
        ),
    ),
    'AO' => array(
        'postcode' => array(
            'required' => false,
            'hidden'   => true,
        ),
        'state'    => array(
            'label' => ['Province', 'woocommerce'],
            'priority' => 70,
        ),
    ),
    // + another arrays
);

foreach($countries as &$country) {
    if(array_key_exists('state', $country)
        && array_key_exists('priority', $country['state'])) {
        unset($country['state']['priority']);
    }
}
var_dump($countries);
...