Php 将数组简化为字符串避免foreach

Php 将数组简化为字符串避免foreach,php,arrays,Php,Arrays,我有一个数组要简化为字符串,但我必须做很多次,所以我想使用一些数组PHP函数(一些数组遍历、数组缩减的组合),但没有一个适合我的需要,但我相信有一个解决方案我错过了。代码也必须符合PHP5.6 $list =[ 'k1' => 'vA1 vA2 vA2', 'k2' => 'vB1 vB2 vB2', 'k3' => '', 'k4' => 'vC1 vC2 vC2', 'k5' => NULL, 'k6' =>

我有一个数组要简化为字符串,但我必须做很多次,所以我想使用一些数组PHP函数(一些数组遍历、数组缩减的组合),但没有一个适合我的需要,但我相信有一个解决方案我错过了。代码也必须符合PHP5.6

$list =[
    'k1' => 'vA1 vA2 vA2',
    'k2' => 'vB1 vB2 vB2',
    'k3' => '',
    'k4' => 'vC1 vC2 vC2',
    'k5' => NULL,
    'k6' => 'vD1 vD2 vD2',
];

function reduce($list){
    $_buff="";
    $_sep="";
    foreach ($list as $k => $v){
        if($v===null){
            continue;
        }
        $_buff.="$_sep$k $v";
        $_sep="; ";
    }
    return $_buff;
}

echo reduce($list)."\n";
预期的结果是

请注意,如果值为空字符串或null,则会出现不同的行为。

我认为应该使用、、和

数组过滤器将删除空值。 数组_键将检索这些键。 数组_值将检索这些值。 数组映射将处理每个单元格。 内爆会将阵列的每个单元粘在一起

编辑:自从我第一次误读后,我已经修改了整个代码。现在,解决方案符合您的需要。

试试这个

function reduce($list){
    $array = [];
    foreach( $list as $key => $value ){
        $tmp = [];
        if ( !is_null($value) ){
            $tmp[] = $key;
            $tmp[] = $value;
            $array[] = implode(" ", $tmp);
        }
    }
    return implode("; ", $array);
}
您可以使用并喜欢:

结果是:

k1 vA1 vA2 vA2;k2 vB1 vB2 vB2;k3;k4-vC1-vC2-vC2;k6 vD1 vD2 vD2


我认为foreach或任何array_*函数的执行时间不会有显著差异。我想,只有当记录增长超过10万条时,这才有意义

$result = array();

array_walk($list, function($value, $key) use (&$result) {
    if($value!==null) {
        $result[] = $key .' '. $value;
    }
});

print_r(implode('; ', $result));

你为什么不比较一下所有答案所用的时间,然后选择最好的一个;)

我认为这是一个非常干净、简单的解决方案:

function reduce($list) {
    $result = "";
    foreach ($list as $key => $value) {
        if ($value === NULL) continue;

        $result .= " $key $value;";
    }

    // remove trailing semicolon
    $result = substr($result, 0, -1);

    return $result;
}

这不是答案,而是关于问题和答案的一些想法和数据

我的目标是避免foreach,因为它很慢

令人惊讶的是,我的实现是最快的

正如@kunruh
foreach
所指出的,它比函数的收集和为中间值分配内存要快

探查器下的代码:

<?php

function filterNull($v) {
    if ($v === null) {
        return false;
    }
    return true;
}

class ProfileSolution
{
    const LOOP_LV1 = 200;
    const LOOP_LV2 = 300;
    public function reduceIvan($list){
        $_buff="";
        $_sep="";
        foreach ($list as $k => $v){
            if($v===null){
                continue;
            }
            $_buff.="$_sep$k $v";
            $_sep="; ";
        }
        return $_buff;
    }
    public function reduceMateiMihai ($list)
    {
        $_list = array_filter($list, function ($value) {
            return $value !== null;
        });

        $array = array_map(function ($key, $value) {
            return trim($key . ' ' . $value);
        }, array_keys($_list), $_list);

        return implode('; ', $array);
    }
    public function reduceMasterFly($list){
        $array = [];
        foreach( $list as $key => $value ){
            $tmp = [];
            if ( !is_null($value) ){
                $tmp[] = $key;
                $tmp[] = $value;
                $array[] = implode(" ", $tmp);
            }
        }
        return implode("; ", $array);
    }
    public function reduceKunruh($list) {
        $result = "";
        foreach ($list as $key => $value) {
            if ($value === NULL) continue;

            $result .= " $key $value;";
        }

        // remove trailing semicolon
        $result = substr($result, 0, -1);

        return $result;
    }
    public function reduceHmmm ($list)
    {
        $result = array();

        array_walk($list, function($value, $key) use (&$result) {
            if($value!==null) {
                $result[] = $key .' '. $value;
            }
        });

        return print_r(implode('; ', $result),true);
    }
    public function reduceAd ($list)
    {
        $filteredList = array_filter($list, 'filterNull');
        return implode("; ", array_map(function($k, $v){
            return "$k $v";
        }, array_keys($filteredList), array_values($filteredList)));
    }

    public function testReduceIvan ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceIvan($list);
        }
    }
    public function testReduceMateiMihai ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceMateiMihai($list);
        }
    }
    public function testReduceMasterFly ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceMasterFly($list);
        }
    }
    public function testReduceKunruh ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceKunruh($list);
        }
    }
    public function testReduceHmmm ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceHmmm($list);
        }
    }
    public function testReduceAD ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceAD($list);
        }
    }


    public function run ()
    {
        $list =[
            'k1'    => 'magni dolores eos qui ratione voluptatem sequi nesciunt. Neque',
            'k2'    => 'porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem',
            'k3'    => '',
            'k4'    => 'minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem',
            'k5'    => NULL,
            'k6'  => 'non numquam eius modi tempora incidunt  labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis',
            'k7'  => 'aut fugit, sed quia consequuntur',
            'k8'  => 'sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae',
            'k9'  => 'vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam',
            'k10' => 'nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam',
            'k11' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor',
            'k12' => 'amet, consectetur, adipisci velit, sed quia',
            'k13' => Null,
            'k14' => 'pain, but because occasionally circumstances occur in which toil and',
            'k15' => 'explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes',
            'k16' => 'amet, consectetur, adipisci velit,  quia',
            'k17' => 'or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter',
            'k18' => 'consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain',
            'k19' => 'voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque',
            'k20' => Null,
            'k21' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit ',
            'k22' => 'amet, consectetur,  velit, sed quia',
            'k23' => 'laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas',
            'k24'  => 'non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis',
        ];

        $t=0;
        while($t++ < self::LOOP_LV1){
            $this->testReduceIvan($list);
            $this->testReduceMateiMihai($list);
            $this->testReduceMasterFly($list);
            $this->testReduceKunruh($list);
            $this->testReduceHmmm($list);
            $this->testReduceAD($list);
        }



    }

}

$o = new ProfileSolution();
$o->run();

你能解释一下你想要什么吗。因为你的代码给你你需要的输出。那么问题是什么呢?您可以尝试使用
print\r($arr,true)
,然后在返回的字符串上应用一个或多个带有合适regexp的
preg\u replace()
调用,以获得所需的输出。@MASIDDIQUI我的目标是efficency@cars10我不认为preg_replace()将比机器的预期输出效率更高,包括钥匙。。但通过这种方法,只有值被连接并返回,所以“k5”不应该被连接returned@IvanButtinoni虽然这确实避免了使用foreach的
,但我很确定它的效率会降低。整个列表由
array\u map()
infrade()
迭代两次,当您可以使用
foreach
解决方案进行一次迭代时。@kunruh我明白您的意思,但尽管我们有勇气说,让我们做一些探查器“k3”应该是statyrim($value)和!==null应该可以。
$result = array();

array_walk($list, function($value, $key) use (&$result) {
    if($value!==null) {
        $result[] = $key .' '. $value;
    }
});

print_r(implode('; ', $result));
function reduce($list) {
    $result = "";
    foreach ($list as $key => $value) {
        if ($value === NULL) continue;

        $result .= " $key $value;";
    }

    // remove trailing semicolon
    $result = substr($result, 0, -1);

    return $result;
}
<?php

function filterNull($v) {
    if ($v === null) {
        return false;
    }
    return true;
}

class ProfileSolution
{
    const LOOP_LV1 = 200;
    const LOOP_LV2 = 300;
    public function reduceIvan($list){
        $_buff="";
        $_sep="";
        foreach ($list as $k => $v){
            if($v===null){
                continue;
            }
            $_buff.="$_sep$k $v";
            $_sep="; ";
        }
        return $_buff;
    }
    public function reduceMateiMihai ($list)
    {
        $_list = array_filter($list, function ($value) {
            return $value !== null;
        });

        $array = array_map(function ($key, $value) {
            return trim($key . ' ' . $value);
        }, array_keys($_list), $_list);

        return implode('; ', $array);
    }
    public function reduceMasterFly($list){
        $array = [];
        foreach( $list as $key => $value ){
            $tmp = [];
            if ( !is_null($value) ){
                $tmp[] = $key;
                $tmp[] = $value;
                $array[] = implode(" ", $tmp);
            }
        }
        return implode("; ", $array);
    }
    public function reduceKunruh($list) {
        $result = "";
        foreach ($list as $key => $value) {
            if ($value === NULL) continue;

            $result .= " $key $value;";
        }

        // remove trailing semicolon
        $result = substr($result, 0, -1);

        return $result;
    }
    public function reduceHmmm ($list)
    {
        $result = array();

        array_walk($list, function($value, $key) use (&$result) {
            if($value!==null) {
                $result[] = $key .' '. $value;
            }
        });

        return print_r(implode('; ', $result),true);
    }
    public function reduceAd ($list)
    {
        $filteredList = array_filter($list, 'filterNull');
        return implode("; ", array_map(function($k, $v){
            return "$k $v";
        }, array_keys($filteredList), array_values($filteredList)));
    }

    public function testReduceIvan ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceIvan($list);
        }
    }
    public function testReduceMateiMihai ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceMateiMihai($list);
        }
    }
    public function testReduceMasterFly ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceMasterFly($list);
        }
    }
    public function testReduceKunruh ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceKunruh($list);
        }
    }
    public function testReduceHmmm ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceHmmm($list);
        }
    }
    public function testReduceAD ($list)
    {
        $t=0;
        while($t++ < self::LOOP_LV2){
            $res="";
            $res=$this->reduceAD($list);
        }
    }


    public function run ()
    {
        $list =[
            'k1'    => 'magni dolores eos qui ratione voluptatem sequi nesciunt. Neque',
            'k2'    => 'porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem',
            'k3'    => '',
            'k4'    => 'minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem',
            'k5'    => NULL,
            'k6'  => 'non numquam eius modi tempora incidunt  labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis',
            'k7'  => 'aut fugit, sed quia consequuntur',
            'k8'  => 'sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae',
            'k9'  => 'vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam',
            'k10' => 'nam libero tempore, cum soluta nobis est eligendi optio, cumque nihil impedit, quo minus id, quod maxime placeat, facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam',
            'k11' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor',
            'k12' => 'amet, consectetur, adipisci velit, sed quia',
            'k13' => Null,
            'k14' => 'pain, but because occasionally circumstances occur in which toil and',
            'k15' => 'explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes',
            'k16' => 'amet, consectetur, adipisci velit,  quia',
            'k17' => 'or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter',
            'k18' => 'consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain',
            'k19' => 'voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque',
            'k20' => Null,
            'k21' => 'inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit ',
            'k22' => 'amet, consectetur,  velit, sed quia',
            'k23' => 'laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas',
            'k24'  => 'non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis',
        ];

        $t=0;
        while($t++ < self::LOOP_LV1){
            $this->testReduceIvan($list);
            $this->testReduceMateiMihai($list);
            $this->testReduceMasterFly($list);
            $this->testReduceKunruh($list);
            $this->testReduceHmmm($list);
            $this->testReduceAD($list);
        }



    }

}

$o = new ProfileSolution();
$o->run();