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

时间:2010-08-13 19:45:08

标签: php hash mapping

让我们假设我们有两个PHP-Arrays:

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

在PHP中,已经有一些Array-Functions允许构建关联数组(AKA哈希),例如,

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

它来了。如果我想以更实用的方式创建哈希,如果我想动态计算密钥和值 并通过map-operation构建哈希,我应该怎么做,如(不工作):

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

这里的问题似乎是期望,行

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

确实会返回一个键值/一对哈希 - 它不会。

问:如何从函数返回键/值对 - 可用于构建关联数组?

<小时/> 的附录

为了弄清楚我真正想要的是什么,我将提供一个perl的哈希生成示例:

 ...
 # 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 个答案:

答案 0 :(得分:2)

在PHP中,数组也可以关联! int-indexed数组只是一个关联数组,0 =&gt; element0等。因此,你可以像这样完成你想要的东西:

$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!'; }

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

答案 1 :(得分:2)

编辑:目前还不完全清楚你是否只是从函数中返回多个变量,或者是否在数组中存储函数时遇到问题。你的帖子给人的印象是在数组中存储函数是有效的,所以我将解决返回多变量问题。

无法在PHP中返回键/值对的单个实例。你必须将它们放在一个数组中......但请记住,在PHP中,数组和hashmap完全相同。这很奇怪(也是有争议的),但这意味着返回一个包含您希望返回的多个值的数组/ hashmap是完全合法的。

我知道只有两种理智的方法(来自10多年的PHP经验)才能从函数中获取多个变量。一个是使输入变量可变的良好时尚方式。

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

这将改变$ a和$ b,而不是像往常一样更改它们的副本。例如:

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

这将返回“505 707”,而不是正常情况下的“1 2”。您可能需要这样做:

vacuumPackSandwitch(&$a, &$b);

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

另一种方法是返回一个数组,我认为这是更清晰和首选的方式。

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

您可以通过执行以下操作同时获取这两个变量:

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

希望它有所帮助!

答案 2 :(得分:1)

我知道这是一个老问题,但谷歌仍然喜欢我最近做的搜索,所以我会发布我的发现。有两种方法可以做到这一点,接近你正在尝试的方法,两者都依赖于同样的一般想法。

创意1:

而不是返回键=&gt;值对,我们返回一个只有一个元素的数组,&#39; key =&gt; value&#39;,用于原始数组的每个顺序元素。然后,我们减少这些数组,并在每一步合并。

$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()
);

OR

创意2:

类似于第一个想法,但我们做的是key =&gt; array_reduce中的值赋值。我们将NULL传递给array_map,它创建了一个数组数组(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_map会创建一个数组数组,因此有点不直观。我只是将它视为array_reduce的前身,所有业务都在这里发生。

创意3:

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

Idea 3是Idea 2的替代品,但我认为它比Idea 2更为粗糙。我们必须使用&#39;使用&#39;跳出功能的范围,这非常难看,可能与OP正在寻求的功能风格背道而驰。

让我们稍微简化一下Idea 2并看看它的样子:

创意2(b):

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

是的,那很好。