Tamsayı tuşları PHP'nin array_merge_recursive davranış

3 Cevap php

Recursively dizileri birleştirme için bir yaklaşım PHP'nin array_merge_recursive() işlev olarak aynı şekilde, orada, except bu tamsayı tuşları dize tuşları olarak aynı tedavi edilir nedir?

(Bu tuşlar ayrıştırma mümkün tamsayılar olarak kalması süreci için önemlidir.)

For example:

$a = array(
    'a' => array(1)
);
$b = array(
    'a' => array(2, 3)
);
var_dump(array_merge_recursive($a, $b));

"a" tuşu ve çıkışında, beklendiği gibi, aşağıdaki birleştirme:

array(1) {
    ["a"] => array(3) {
        [0] => int(1)
        [1] => int(2)
        [2] => int(3)
    }
}

Ancak, (hatta bir dize olarak) tuşları için tamsayılar kullanırken:

$a = array(
    '123' => array(1)
);
$b = array(
    '123' => array(2, 3)
);
var_dump(array_merge_recursive($a, $b));

array_merge_recursive() dönecektir:

array(2) {
    [0] => array(3) {
        [0] => int(1)
    }
    [1] => array(2) {
        [0] => int(2)
        [1] => int(3)
    }
}

Bunun yerine çok istenen of:

array(1) {
    ["123"] => array(3) {
        [0] => int(1)
        [1] => int(2)
        [2] => int(3)
    }
}

Düşünceler?

3 Cevap

kısa bir dize ile dizi anahtarlarını önek:

function addPrefix($a) {return '_' . $a;}
# transform keys
$array1 = array_combine(array_map('addPrefix', array_keys($array1)), $array1);
$array2 = array_combine(array_map('addPrefix', array_keys($array1)), $array1);
# call array_combine
$array = array_map_recursive($array1, $array2);
# reverse previous operation
function stripPrefix($a) {return substr($a, 1);}
$array = array_combine(array_map('stripPrefix', array_keys($array)), $array)

Ben bir dize ekleyerek anahtarları dönüştürme soulmerge fikrini kullanıyorum. Benim yeni fonksiyon sadece, ancak 2 parametreleri işleyebilir, ama bu vardı böyleydi, böylece ben gittim buydu. Bir görünüm var.

// Adds a _ to top level keys of an array
function prefixer($array) {
    $out = array();
    foreach($array as $k => $v) {
        $out['_' . $k] = $v;
    }
    return $out;
}
// Remove first character from all keys of an array
function unprefixer($array) {
    $out = array();
    foreach($array as $k => $v) {
        $newkey = substr($k,1);
        $out[$newkey] = $v;
    }
    return $out;
}
// Combine 2 arrays and preserve the keys
function array_merge_recursive_improved($a, $b) {
    $a = prefixer($a);
    $b = prefixer($b);
    $out = unprefixer(array_merge_recursive($a, $b));
    return $out;
}

Ve ne örnek veri benziyor dışarıda?

// some sample data    
$a = array(
    '123' => array(1)
);
$b = array(
    '123' => array(2, 3)
);

// what do the results say:    
print_r($a);
// Array
// (
//     [123] => Array
//         (
//             [0] => 1
//         )
// 
// )

print_r($b);
// Array
// (
//     [123] => Array
//         (
//             [0] => 2
//             [1] => 3
//         )
// 
// )

Ve en onları deneyelim:

print_r(array_merge_recursive($a, $b));
// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//         )
// 
//     [1] => Array
//         (
//             [0] => 2
//             [1] => 3
//         )
// 
// )

print_r(array_merge_recursive_improved($a, $b));
// Array
// (
//     [123] => Array
//         (
//             [0] => 1
//             [1] => 2
//             [2] => 3
//         )
// 
// )

Eğer anahtarları dizeleri sadece numaraları ile doldurun ve sonra sadece sipariş için başka dizi dolum yerine, bunu doldurmak zaman bir önek ekleyerek dizeleri yapmak gibi tedavi olmak istiyorum.