Array map recursive

Normalde tek boyutlu diziler için ideal olan array_map metodu bilindiği gibi çok boyutlu dizilerde hata vermektedir. Bu duruma alternatif olarak array_walk_recursive de kullanılabilir.

map recursive için örnek kod

function arrayMapRecursive($arr, $call){
    if(is_array($arr)){
        foreach ($arr as $key => $value) {
            if(is_array($value)){
                $arr[$key] = arrayMapRecursive($value, $call);
            }else{
                $arr[$key] = call_user_func($call,$value);
            }
        }
    }
    return $arr;
}

kullanımı

arrayMapRecursive($_POST,'base64_encode');

recursive merge

boyutlu array değişkenleri merge ederken oluşan bir problem var, ilk array değişkenin alt array değişkeni ile aynı keye sahip diğer array değişkenin alt array elemanı ile merge yapmaz üstüne yazar (bu cümleyi muhtemelen bir kaç kez okumuş olabilirsiniz tamamıyla benim suçum).

örnek vereyim

$a = [
    "a" => 86,
    "b" => ["x" => 54, "c" => "pi", "t" =>8],
    "s" => "string"
];

$b => [
    "c" => 98,
    "b" => ["t" => "interval", "r" => 21],
    "d" => "integer"
];

$c = array_merge($a, $b);

//out
/*
[
    "a" => 86,
    "b" => ["t" => "interval", "r" => 21],
    "s" => "string",
    "c" => 98,
    "d" => "integer"
]
*/

Yukardaki durumda bizim isteğimiz $a["b"] ile $b["b"] alt array değerleride birleştirmek olabilirdi. Bu şekilde çok fazla seçenek mevcut php bu gibi durumlar için array_merge_recursive isimli bir methodu hali hazırda var, fakat bu merge olayıda b indexlerini birleştirmek yerine $a["b"] ile $b["b"] çakışan keylerini alttaki gibi array olarak return ediyor
array_merge_recursive çıktısı

/*
[
    "a" => 86,
    "b" => ["x" => 54, "c" => "pi", "t" => [8, "interval"], "r" => 21]
    "s" => "string",
    "c" => 98,
    "d" => "integer"
]
*/

Konu uzuyor tam olarak bizim istediğimiz b indexi alttaki gibi ise

"b" => ["x" => 54, "c" => "pi", "t" => "interval", "r" => 21]

merge recursive için örnek kod

    public function array_merge_with_keys(Array $array, Array $overriteArray)
    {
        foreach ($array as $key=>$value)
        {
            if(is_array($value) && !empty($overriteArray[$key]))
            {
                if(is_array($overriteArray[$key]))
                {
                    $array[$key] = $this->array_merge_with_keys($array[$key], $overriteArray[$key]);
                }
                else
                {
                    $array[$key] = $overriteArray[$key];
                }
            }
            elseif(!empty($overriteArray[$key]))
            {
                $array[$key] = $overriteArray[$key];
            }
        }

        foreach ($overriteArray as $key=>$value)
        {
            if(!empty($array['key']))
            {
                continue;
            }

            $array[$key] = $value;
        }

        return $array;
    }

//out
/*
[
    "a" => 86,
    "b" => ["x" => 54, "c" => "pi", "t" => "interval", "r" => 21]
    "s" => "string",
    "c" => 98,
    "d" => "integer"
]
*/    

Burda ara