散列/数组比较和合并

时间:2014-06-24 16:26:14

标签: php arrays

我有两个数据集。

首先:

{
    "status": "OK",
    "message": "Data Show Successful",
    "name0": "Al",
    "city": "",
    "pree": "R",
    "allknife": [
        {
            "name": "Folder",
            "pos": "G",
            "pos_le": "",
        },
        {
            "name": "Folder Two",
            "pos": "G",
            "pos_le": "",
        }
    ]
}

第二

{
    "status": "OK",
    "message": "Data Show Successful",
    "name0": "",
    "city": "",
    "pree": "R",
    "allknife": [
        {
            "name": "Folder",
            "pos": "",
            "pos_le": "R",
        },
        {
            "name": "Folder Two",
            "pos": "G",
            "pos_le": "",
        }
    ]
}

现在我将第二个数据集与第一个数据集进行比较。如果第二个数据集中的任何项目为空,那么我希望从第一个数据集中提取它。

例如,在第二个散列name0中为空,因此应使用第一个散列中的值替换该值。 allknife数组也应该使用相同的逻辑。

我无法理解如何实现它。我正在尝试使用array_merge(),但无济于事。

3 个答案:

答案 0 :(得分:0)

由于你想用name2中的valie替换name0的值,你应该使用

array_replace(array1,array2)

答案 1 :(得分:0)

有许多事情可能会优化,但我留给你!

// Just a simple example
function arfill($example, $input){
    foreach($input as $key => $value){
        if($value == ""){
            // Easy peasy set it 
            $input[$key] = $example[$key];
        }

        if(is_array($value)){
            // Little recursion here
            $input[$key] = arfill($example[$key], $input[$key]);
        }
    }

    return $input;
}

答案 2 :(得分:0)

这是一个想法,从两个数组中删除空条目(array_filter_recursive())并使用array_replace_recursive()。

array_replace_recursive:

  

array_replace_recursive()用相同的值替换array1的值   来自以下所有数组的值。如果是第一个数组的一个键   存在于第二个数组中,其值将被该值替换   从第二个数组。如果密钥存在于第二个数组中,则不存在   第一个,它将在第一个数组中创建。如果只存在密钥   在第一个数组中,它将保持原样。如果是几个阵列   通过更换,他们将按顺序处理,后来   数组覆盖以前的值。

$arr1 = json_decode( $arr1, true );
$arr2 = json_decode( $arr2, true );

function array_filter_recursive( $input ) {
    foreach ( $input as &$value ) {
        if ( is_array( $value ) )
            $value = array_filter_recursive( $value );
    }
    return array_filter( $input );
} 

$arr = array_replace_recursive( 
    $arr1, $arr2, array_filter_recursive( $arr1 ), array_filter_recursive( $arr2 ) 
);

print_r( $arr );
/*
Array (
    [status] => OK
    [message] => Data Show Successful
    [name0] => Al
    [city] => 
    [pree] => R
    [allknife] => Array (
            [0] => Array (
                    [name] => Folder
                    [pos] => G
                    [pos_le] => R
                )
            [1] => Array (
                    [name] => Folder Two
                    [pos] => G
                    [pos_le] => 
                )
        )
)
*/