PHP中的键和值重新格式化

时间:2016-04-12 01:07:17

标签: php arrays sorting laravel laravel-5.1

在尝试回答之前,请先阅读整个问题。如果我有两个关联数组,其中一些值只匹配一次:

$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解决方案也没问题。非常感谢你。

2 个答案:

答案 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);