【问题标题】:PHP: Changing or padding an array's key namesPHP:更改或填充数组的键名
【发布时间】:2011-01-22 17:26:52
【问题描述】:

我有以下数组:

$person = array('first_name' => 'Fred', 'last_name' => 'Flintstone');

我想更改/填充键,以便数组最终为(注意额外的冒号):

$person = array('::first_name::' => 'Fred', '::last_name::' => 'Flintstone');

出于某种原因,我在最简单的方法上画了一个空白

【问题讨论】:

  • 您能解释一下为什么需要这个吗?因为我感觉你从错误的方向解决问题。
  • 我允许在模板中替换用户指定的值数组。该模板可能包含像 ::first_name:: 这样的标签,我认为用户提供一组“纯英语”键比那些包含冒号的键更具可读性。
  • 我会使用 %NAME% 而不是 ::
  • 事实上,这就是我在模板中使用的。 :P

标签: php arrays replace


【解决方案1】:

Laykes 解决方案的变体,只是不创建新数组:

foreach($array as $key => $val) {
    $array["..$key.."] = $val;
    unset($array[$key]);
}

我假设您想这样做是因为您将模板中的占位符替换为以下内容:

$template = str_replace(array_keys($person), $person, $template);

如果是这样,请记住您将在 $person 上迭代两次。一次换钥匙,另一次拿到钥匙。因此,使用将键作为填充值返回的函数替换对 array_keys() 的调用会更有效,例如像

function array_keys_padded(array $array, $padding) {
    $keys = array();
    while($key = key($array)) {
        $keys[] = $padding . $key . $padding;
        next($array);
    }
    return $keys;
}
// Usage
$template = str_replace(array_keys_padded($person, '::'), $person, $template);

但话又说回来,您也可以通过简单的迭代来做到这一点:

foreach($person as $key => $val) {
    str_replace("::$key::", $val, $template);
}

但如果你不这样做,请忽略这个答案:)

出于好奇,您的用户实际上是如何提供数组的?

【讨论】:

  • 用户在表单中提供数组作为标签列表。就像您在 stackoverflow 问题上放置的标签一样。
【解决方案2】:

你也可以这样做:

<?php
$person = array('first_name' => 'Fred', 'last_name' =>'Flintstone');

$keys = array_keys($person); // array of keys.

for($i=0;$i<count($person);$i++) {
    $keys[$i] = "::$keys[$i]::"; // change each key.
}
// recreate array using changed keys.
$person = array_combine($keys,array_values($person)); 

var_dump($person);
?>

输出:

array(2) {
  ["::first_name::"]=>
  string(4) "Fred"
  ["::last_name::"]=>
  string(10) "Flintstone"
}

【讨论】:

    【解决方案3】:

    我不知道最简单的方法,但我想最快的方法就是循环。

    foreach($person as $key=>$value) {
    $newArray['::' . $key .'::'] = $value;
    
    }
    

    我猜你甚至可以这样做

    function tokenize($person)
    {
        foreach($person as $key=>$value) {
        $newArray['::' . $key .'::'] = $value;    
        }
        return $newArray;
    }
    
    $person = array('first_name' => 'Fred', 'last_name' ='Flintstone');
    $newPerson = array_map("tokenize", $person);
    print_r($newPerson);
    

    【讨论】:

    • tokenize 函数不起作用,因为 array_map 会将 $person 数组的元素而不是 $person 数组本身传递给它。
    • 啊,好吧。我没有意识到这一点。那么你总是可以使用array_keys() 和array_values()。感谢 cmets。
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2016-06-12
    相关资源
    最近更新 更多