更改数组中键值的模式

时间:2018-11-28 20:03:49

标签: php arrays

我有一个数组:

[ 0 ] => 3000mAh battery
[ 1 ] => charges 1 smartphone
[ 2 ] => input: 5W (5V, 1A) micro USB port
[ 3 ] => output: Micro USB cable: 7.5W (5V, 1.5A)
[ 4 ] => recharge time 3-4 hours
[ 5 ] => includes Micro USB cable
[ 6 ] => 1-Year Limited Warranty

我想删除这些键,并将字符串中已经存在的部分放入值中。我想要的最终结果是:

[ battery ] => 3000mAh 
[ charges ] =>  1 smartphone
[ input ] =>  5W (5V, 1A) micro USB port
[ output ] =>  Micro USB cable: 7.5W (5V, 1.5A)
[ recharge ] =>  time 3-4 hours
[ includes ] =>  Micro USB cable
[ Warranty ] => 1-Year Limited 

这里有三个条件:

1)如果字符串具有:然后在first之前输入文本,然后将其放入键中 例如:

[ 2 ] => input: 5W (5V, 1A) micro USB port
[ input ] =>  5W (5V, 1A) micro USB port

2)如果字符串以数字开头,则取字符串的最后一个单词,并像键一样放上它:

[ 0 ] => 3000mAh battery
[ battery ] => 3000mAh 

3)如果字符串以字母开头,则取字符串的第一个单词,并像键一样放上它:

[ 1 ] => charges 1 smartphone
[ charges ] =>  1 smartphone

这是我解决了第一个条件的代码,您能帮我其余的工作吗?

$new_array= array_reduce($old_array, function ($c, $v){ 
            preg_match('/^([^:]+):\s+(.*)$/', $v, $m); 
            if(!empty($m[1])){
                return array_merge($c, array($m[1] => $m[2]));}
            else{
                return array();
            }
        },[]);

2 个答案:

答案 0 :(得分:1)

与其使用正则表达式,不如使用正则表达式,仅使用Table <- data.frame(Column = c("|1||KK|12|Gold||4K|", "|1||Rst|E|Silver||13||", "|1||RST|E|Silver||18||", "|1||KK|Y|Iron|y|12||", "|1||||Copper|Cpr|||E", "|1||||Iron|||12|F"), stringsAsFactors = FALSE) 可以更快地分解项目,并且(IMHO)更加清晰。首先,它看起来要用explode()进行分割,如果产生结果,则将第一项用作键,将其余项用作内容。如果失败,则使用空格并仅检查要使用的版本(在第一个字符上使用:)...

is_numeric()

答案 1 :(得分:1)

您可以使用ctype_alphais_numeric检查前几个字符。要检查:,可以使用explode并检查计数是否大于1。

要写入值,可以使用implode,并在空格处加上胶水。

$result = [];

foreach ($items as $item) {
    $res = explode(':', $item);
    if (count($res) > 1) {
        $key = $res[0];
        array_shift($res);
        $result[$key] = implode(':', $res);
        continue;
    }
    if (is_numeric($item[0])) {
        $parts = (explode(' ', $item));
        $key = array_pop($parts);
        $result[$key] = implode(' ', $parts);
        continue;
    }
    if (ctype_alpha ($item[0])) {
        $parts = explode(' ', $item);
        $key = array_shift($parts);
        $result[$key] = implode(' ', $parts);
    }
}

print_r($result);

Demo