让我们假设我们有两个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中是不可能的。感谢所有响应者。
答案 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()
);
是的,那很好。