在尝试回答之前,请先阅读整个问题。如果我有两个关联数组,其中一些值只匹配一次:
$array1 = ['key1' => 'value1', 'key3' => 'value2', etc...];
$array2 = ['key2' => 'value1', 'key4' => 'value2', etc...];
但$ array2比$ array 1长,在这种情况下,键没有值:
$array1 = ['key1' => 'value1', 'key3' => 'value2'];
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3'];
然后我如何将它们组合起来得到以下结果:
$array3 = [
'value1' => [$myconstant => key2],
'value2' => [$myconstant => key4],
'value3' => [$myconstant => ''],
etc...];
请注意,如果没有匹配项,则使用空字符串代替嵌入式关联数组中的键。事实上,$ array1是必要的唯一原因是因为我需要知道什么时候与$ array2匹配才能获得正确的格式。
值不会沿着etc ...链重复。
我正在使用Laravel并尝试使用Collections,但基本的PHP解决方案也没问题。非常感谢你。
答案 0 :(得分:1)
我认为你遇到的最大障碍是如何将键和键中的值转换为值。 array_flip就是这个问题的答案。完成后,您可以使用简单的foreach循环解决问题。
$myconstant = 'foo';
$array1 = ['key1' => 'value1', 'key3' => 'value2'];
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3'];
// array_flip switches keys and values in an array
$flip1 = array_flip($array1);
$flip2 = array_flip($array2);
$array3 = [];
foreach($flip2 as $key => $value) {
if(!isset($flip1[$key])) {
$array3[ $key ] = [ $myconstant => '' ];
} else {
$array3[ $key ] = [ $myconstant => $value ];
}
}
Laravel Collections也有flip()方法。这可能有助于您将脚本翻译成Laravel。
答案 1 :(得分:1)
<?php
$array1 = ['key1' => 'value1', 'key3' => 'value2'];
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3'];
function x (array $a= array(), array $b = array()) {
$array = array();
$index = new ArrayObject($a);
$seed = new ArrayObject($b);
$a_it = $index->getIterator();
$b_it = $seed->getIterator();
while ($a_it->valid()) {
$x = $a_it->current();
$y = ($b_it->valid()) ? $b_it->current() : NULL;
if ($y !== NULL) {
# there is a value to compare against
if ($x === $y) {
$array["{$x}"] = array('myConst'=>$a_it->key());
}
$b_it->next();
} else {
# there is no value to compare against
$array["{$x}"] = array('myConst'=> '');
}
$a_it->next();
}
return $array;
}
$read = x($array2, $array1);
print_r($read);