如何通过前缀分隔php数组项

时间:2018-12-24 14:43:11

标签: php arrays

当它们具有公共前缀时,我想分离一个PHP数组。

$data = ['status.1', 'status.2', 'status.3',
         'country.244', 'country.24', 'country.845',
         'pm.4', 'pm.9', 'pm.6'];

我希望每个人都在单独的变量中,例如$status, $countries, $pms,其中将包含:

$status = [1,2,3];
$country = [244, 24, 845]
$pms = [4,9,6]

我当前的代码需要1.5秒才能对它们进行分组:

$statuses = [];
$countries = [];
$pms = [];
$start = microtime(true);
foreach($data as $item){
    if(strpos($item, 'status.') !== false){
        $statuses[]= substr($item,7);
    }

    if(strpos($item, 'country.') !== false){
        $countries[]= substr($item,8);
    }

    if(strpos($item, 'pm.') !== false){
        $pms[]= substr($item,3);
    }
}
$time_elapsed_secs = microtime(true) - $start;
print_r($time_elapsed_secs);

我想知道是否有更快的方法

6 个答案:

答案 0 :(得分:4)

这将为您提供更多动态前缀的结果-首先使用定界符爆炸,然后按键插入结果数组。

要分隔值,可以使用:extract

考虑以下代码:

$data = array('status.1','status.2','status.3', 'country.244', 'country.24', 'country.845', 'pm.4','pm.9', 'pm.6');

$res = array();
foreach($data as $elem) {
    list($key,$val) = explode(".", $elem, 2);
    if (array_key_exists($key, $res))
        $res[$key][] = $val;
    else $res[$key] = array($val);

}
extract($res); // this will seperate to var with the prefix name

echo "Status is: " . print_r($status); // will output array of ["1","2","3"]

此摘录花费的时间少于0.001秒...

答案 1 :(得分:3)

continue添加到每个if中,因此,如果其中一个是foreach($data as $item){ if(strpos($item, 'status.') !== false){ $statuses[]= substr($item,7); continue; } if(strpos($item, 'country.') !== false){ $countries[]= substr($item,8); continue; } if(strpos($item, 'pm.') !== false){ $pms[]= substr($item,3); continue; } } ,那么它将不会运行其他的……在最后一个中并不需要,因为显然循环还是重新开始。应该可以节省一点时间,但是怀疑它是否会像您想保存的一样多。

const

答案 2 :(得分:3)

我会使用explode来拆分它们。

类似这样的东西:

$arr = array("status" => [],"country" => [],"pm" => []);
foreach($data as $item){
    list($key,$val) = explode(".",$item);
    $arr[$key][] = $val;
}
extract($res); // taken from david's answer

这是更具可读性的代码(在我看来)

___编辑____

正如@DavidWinder所评论的那样,这既不是动态的,也不会导致不同的变量-请参阅his answer,以获取针对您问题的最完整解决方案

答案 3 :(得分:0)

使用Explode。这也是使用$ limit参数提高性能并避免在使用其他'时出现错误行为的好方法。值。

$arr = [];
foreach($data as $item){
    list($key,$val) = explode('.', $item, 2);
    if (!$key || !$val) continue;
    $arr[$key][] = $val;
}
var_dump($arr); 

答案 4 :(得分:0)

我不确定这是否会提高性能,但是您可以通过以下方式重新排列数组:每行都有一个标题和相应的值,然后使用array_column()将所需的数据分组

这是如何将数据分组的示例。 (PHP 7.1.25 +)

$groupedData = array_map(function($arg) {
    [$key, $val] = explode('.', $arg); # for PHP 5.6 < 7.1.25 use list($key, $val) = explode(...)
    return array($key => $val);
}, $data);

然后,您可以像这样拉出所有国家/地区ID:

$countries = array_column($groupedData, 'country');

这里是live demo

答案 5 :(得分:0)

如果是我,我会那样做...

<?php

$data = array ('status.1', 'status.2', 'status.3',
         'country.244', 'country.24', 'country.845',
         'pm.4', 'pm.9', 'pm.6');

$out = array ();

foreach ( $data AS $value )
{
    $value = explode ( '.', $value );

    $out[$value[0]][] = $value[1];
}

print_r ( $out );

?>