代码之家  ›  专栏  ›  技术社区  ›  rubber boots

从函数的关联数组返回单个元素

  •  1
  • rubber boots  · 技术社区  · 14 年前

     $some_array = array('a','b','c','d','e','f');
     $another_array = array(101,102,103,104,105,106);
    

    关联数组

     $hash = array_combine(
               $some_array,
               $another_array
             );
    

    在飞行中 不起作用 ):

     # wishful thinking
     $hash = array_map(
                function($a, $b){ return ($a => $b); },
                $some_array,
                $another_array
             );
    

                ...
                function($a, $b){ return ($a => $b); }
                ...
    

    会回来的 散列的键值/键值对 -但事实并非如此。

    问:如何从一个函数返回一个键/值对-可以用来建立一个关联数组?


     ...
     # we have one array of characters (on which our hash generation is based)
    
     my @array = qw{ a b c d e f };
    
     # now *generate* a hash with array contents as keys and 
     # ascii numbers as values in a *single operation *
     # (in Perl, the $_ variable represents the actual array element)
    
     my %hash = map +($_ => ord $_), @array;
     ...
    

    结果(%hash):

     a => 97
     b => 98
     c => 99
     d => 100   
     e => 101
     f => 102
    

    从回答来看,我现在认为这在PHP中是不可能的。感谢所有响应者。


    3 回复  |  直到 12 年前
        1
  •  2
  •   Teekin    14 年前

    EDIT:不完全清楚的是,仅仅从一个函数返回多个变量会有问题,还是在数组中存储一个函数会有问题。您的帖子给人的印象是,将函数存储在数组中是可行的,因此我将处理返回多变量问题。

    我只知道两种明智的方法(10多年的PHP经验)从函数中获取多个变量。一种是使输入变量可变的好方法。

    function vacuumPackSandwitch(&$a, &$b) {
        $a = 505;
        $b = 707;
    }
    

    $a = 1;
    $b = 2;
    vacuumPackSandwitch($a, $b);
    print $a.' '.$b;
    

    这将返回“505 707”,而不是正常的“12”。您可能需要:

    vacuumPackSandwitch(&$a, &$b);

    但如果是这样,PHP编译器会及时通知您。

    另一种方法是返回一个数组,我认为这是更清晰、更可取的方法。

    function ($a, $b) {
        return array($a, $b);
    }
    

    list($c, $d) = vacuumPackSandwitch($a, $b);
    

    希望有帮助!

        2
  •  2
  •   hb2pencil    14 年前

    在PHP中,数组也可以是关联的!整型索引数组只是一个0=>的关联数组;元素0等等。因此,你可以像这样完成你想要的:

    $somearray = array('name' => 'test', 'pass' => '***', 'group' => 'admin');
    
    function myfunc($a, $b) { return array($a => $b); }
    
    if($somearray['name'] == 'test') { echo 'it works!'; }
    
    // Let's add more data with the function now
    $somearray += myfunc('location', 'internet');
    
    //Test the result
    if($somearray['location'] == 'internet') { echo 'it works again!'; }
    

    这真的很简单。希望这有帮助。

        3
  •  1
  •   DKdev    8 年前

    我知道这是一个老问题,但谷歌仍然喜欢我最近做的搜索,所以我会发布我的发现。有两种方法接近你所尝试的,都依赖于相同的总体思路。

    $array = array_map(
        function($a, $b){
            return array($a => $b);
        },
        $arr1,
        $arr2
    );
    $array = array_reduce(
        $array,
        function($carry, $element){
            $carry = array_merge($carry, $element);
            return $carry;
        },
        array()
    );
    

    或者

    想法二:

    http://php.net/manual/en/function.array-map.php )

    $array = array_map(NULL, $a, $b);
    $array = array_reduce(
        $array,
        function($carry, $element){
            $carry[$element[0]] = $element[1];
            return $carry;
        },
        array()
    );
    

    就我个人而言,我发现Idea 2比Idea 1优雅得多,尽管它需要知道将NULL作为函数传递给array\u map会创建一个数组,因此有些不直观。我只是认为它是array\u reduce的前身,所有的业务都发生在这里。

    $carry = array();
    $uselessArray = array_map(
        function($a, $b) use ($carry){
            $carry[$a] = $b;
        },
        $a,
        $b
    );
    

    想法3是想法2的另一种选择,但我认为它比想法2更粗糙。我们必须使用'use'跳出函数的范围,这很难看,可能与OP所追求的函数风格相反。

    让我们稍微简化一下想法2,看看效果如何:

    想法2(b):

    $array = array_reduce(
        array_map(NULL, $a, $b),
        function($carry, $element){
            $carry[$element[0]] = $element[1];
            return $carry;
        },
        array()
    );
    

    是的,很好。