【问题标题】:How to combine the keys and values of an array in PHP如何在 PHP 中组合数组的键和值
【发布时间】:2018-12-11 19:44:03
【问题描述】:

假设我在 PHP 中有一个键/值对数组:

array( 'foo' => 'bar', 'baz' => 'qux' );

将其转换为如下所示的数组的最简单方法是什么?

array( 'foo=bar', 'baz=qux' );

array( 0 => 'foo=bar', 1 => 'baz=qux');

在 perl 中,我会做类似的事情

map { "$_=$hash{$_}" } keys %hash

PHP 中的panoply of array functions 中有类似的内容吗?我所看到的一切似乎都不是一个方便的解决方案。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    解决这个问题的另一个选择:在 PHP 5.3+ 上,您可以使用带有闭包的 array_map()(您可以在 PHP 5.2 之前的版本中执行此操作,但代码会变得非常混乱!)。

    “哦,但是在array_map()你只能获得价值!”。

    是的,没错,但我们可以映射多个数组! :)

    $arr = array( 'foo' => 'bar', 'baz' => 'qux' );
    $result = array_map(function($k, $v){
        return "$k=$v";
    }, array_keys($arr), array_values($arr));
    

    【讨论】:

    • 在 PHP 8+ 中,由于新的 fn 语法:$result = array_map(fn($k, $v) => "$k=$v", array_keys($arr), array_values($arr));,它更加简单
    【解决方案2】:
    function parameterize_array($array) {
        $out = array();
        foreach($array as $key => $value)
            $out[] = "$key=$value";
        return $out;
    }
    

    【讨论】:

    • 我接受这个答案,因为它很简单,以及我最终如何解决我的问题。我很失望没有办法在单个表达式中做到这一点,避免需要临时 $out 变量。
    • 如果您是 Perl 用户,这只是您在使用 PHP 过程中会遇到的众多失望之一。
    • @chaos 是啊,生活很坎坷,php是可读的。 @nohat虽然这不会按照您的问题规定“转换”数组。它使一个新的。 “数组函数的集合”?咯咯笑。
    • @GZipp:是的,$foo = isset($bar['baz']) ? $bar['baz'] : 'qxx'$foo = $bar[baz] || 'qxx' 可读性强得多。无法想象我在想什么。
    • 好吧,"?:" 运算符被添加到 php 中,所以 perlish 编码人员可以将所有内容放在一行;我以为你会喜欢这个功能。
    【解决方案3】:

    一种“奇怪”的方法=P

    // using '::' as a temporary separator, could be anything provided
    // it doesn't exist elsewhere in the array
    $test = split( '::', urldecode( http_build_query( $test, '', '::' ) ) );
    

    【讨论】:

    • 我想出了相同的解决方案,但我对编码/解码过程(如果它是单语义的)感到“好奇”))。我尝试使用它来快速安排 ORM 中的查询条件,但由于某种原因,对 urlencode/urldecode 时的数据安全性存在疑问。
    【解决方案4】:

    chaos 的回答很好,很直接。不过,从更一般的意义上讲,您可能错过了 array_map() 函数,这是您在 map { "$_=$hash{$_}" } keys %hash 示例中提到的。

    【讨论】:

    • array_map() 似乎只提供了数组的值
    • 不幸的是,PHP 5.3 以下的严格等效代码是create_function()-using abomination。
    • 啊,不,如果您需要密钥,那么您可以使用 array_walk() 代替(尽管这会就地修改数组而不是返回新数组)。
    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多