【问题标题】:Lowercase all the associative array keys without foreach小写所有没有 foreach 的关联数组键
【发布时间】:2020-03-14 19:32:19
【问题描述】:

我有这个变量保存的数组:

$get_multiple_role_will_redirect = isset($_POST['multiple_role_will_redirect']) ? $_POST['multiple_role_will_redirect'] : 0;

Array
(
    [Administrator] => 
    [Editor] => 
    [Author] => 
    [Contributor] => 
    [Subscriber] => 
    [Shop_manager] => 
    [Shop_accountant] => 
    [Shop_worker] => 
    [Shop_vendor] => 
    [Edd_subscriber] => 
    [Customer] => 
)

现在,我想将所有键都小写。为此,我正在这样做 foreach:

$multiple_role_will_redirect = [];
foreach($get_multiple_role_will_redirect as $key => $value) {
    $key = strtolower($key);
    $multiple_role_will_redirect[$key] = $value;
}

我的问题是,如果没有foreach 循环,还有其他方法可以小写数组key吗?

我已经检查过:

array_filter($get_multiple_role_will_redirect, 'strtolower');

但它不是小写的数组键。

【问题讨论】:

  • 为什么不想使用foreach?
  • 只想知道有没有更好的办法
  • 我认为没有循环数组就没有办法做到这一点。
  • 检查@Vimal 答案
  • 它也会循环数组。

标签: php arrays foreach lowercase


【解决方案1】:

我认为array_change_key_case 函数适合你。

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
print_r(array_change_key_case($age,CASE_LOWER));

https://www.w3schools.com/php/func_array_change_key_case.asp

【讨论】:

  • 我明白了。它会起作用,但是如果我愿意的话,有没有办法在没有 for each 的情况下清理价值?
  • 我知道,但我想问的是,如果我想清理该值,那么在没有 foreach 的帮助下还有其他功能吗?
【解决方案2】:

我只是想表明没有循环是不可能的。对于接受的答案的array_change_key_case 也有循环实现ZEND_HASH_FOREACH_KEY_VAL

参考array_change_key_casesrc: array_change_key_case的源码

PHP_FUNCTION(array_change_key_case)
{
    zval *array, *entry;
    zend_string *string_key;
    zend_string *new_key;
    zend_ulong num_key;
    zend_long change_to_upper=0;

    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_ARRAY(array)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(change_to_upper)
    ZEND_PARSE_PARAMETERS_END();

    array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(array)));

    ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, string_key, entry) {
        if (!string_key) {
            entry = zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
        } else {
            if (change_to_upper) {
                new_key = php_string_toupper(string_key);
            } else {
                new_key = php_string_tolower(string_key);
            }
            entry = zend_hash_update(Z_ARRVAL_P(return_value), new_key, entry);
            zend_string_release_ex(new_key, 0);
        }

        zval_add_ref(entry);
    } ZEND_HASH_FOREACH_END();
}

【讨论】:

    【解决方案3】:

    您可以通过将旧的小写键与旧的值组合来创建一个新数组。这里替换原来的。

    <?php
    
    $items = 
    [
        'Foo' => 'hello',
        'Bar' => 'world'
    ];
    
    $items = array_combine(
        array_map('strtolower', array_keys($items)), 
        $items
    );
    
    var_export($items);
    

    输出:

    array (
        'foo' => 'hello',
        'bar' => 'world',
      )
    

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 2017-05-04
      • 1970-01-01
      • 2016-05-21
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2010-09-26
      相关资源
      最近更新 更多