Anonim bir işlevi anonim bir dizi üzerinde eşlerken, anahtarlara erişmenin bir yolu yoktur:
array_map(
function($val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
array_reduce, anahtarlara da erişemez. array_walk anahtarlara erişebilir, ancak dizi başvuruya göre aktarılır, bu da bir yönlendirme katmanı gerektirir.
Bazı çözümler şunlardır:
Çift dizisi
Bu kötü, çünkü orijinal diziyi değiştiriyoruz. Ayrıca, standart "dizi ()" çağrıları, dizinin uzunluğu ile doğrusal olarak artar:
array_map(
function($pair) use ($foo) {
list($key, $val) = $pair;
},
array(array(key1, val1),
array(key2, val2),
));
Geçici değişken
Orijinal diziye göre hareket ediyoruz ve ortak şablon sabittir, ancak mevcut bir değişkeni kolayca bozabiliriz:
$i_hope_this_does_not_conflict = array(key1 => val1,
key2 => val2,
);
array_map(
function($key, $val) use ($foo) { },
array_keys($i_hope_this_does_not_conflict),
$i_hope_this_does_not_conflict);
unset($i_hope_this_does_not_conflict);
Tek atış işlevi
Mevcut adların bozulmasını önlemek için işlev kapsamını kullanabiliriz, ancak fazladan bir "kullanım" katmanı eklememiz gerekir:
call_user_func(
function($arr) use ($foo) {
return array_map(function($key, $val) use ($foo) { },
array_keys($arr),
$arr);
},
array(key1 => val1,
key2 => val2,
));
Çok bağımsız değişkenli tek atış işlevi
Orijinal kapsamda eşleştirdiğimiz işlevi, standart şablonun "kullanılmasını" önlemek için tanımlarız:
call_user_func(
function($f, $arr) {
return array_map($f, array_keys($arr), $arr);
},
function($key, $val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
Yeni işlev
Unutulmaması gereken ilginç şey, son tek vuruşluk fonksiyonumuzun güzel, genel bir imzası olması ve çok sayıda array_map'e benzemesi. Buna bir isim verip yeniden kullanmak isteyebiliriz:
function array_mapk($f, $arr) {
return array_map($f, array_keys($arr), $arr);
}
Uygulama kodumuz şu hale gelir:
array_mapk(
function($key, $val) use ($foo) { },
array(key1 => val1,
key2 => val2,
));
Dolaylı Dizi Yürüyüşü
Yukarıdakileri yazarken, argümanının referans olarak iletilmesini gerektirdiğinden array_walk'u yok saymıştım; ancak, o zamandan beri call_user_func kullanarak bu sorunu çözmenin kolay olduğunu anladım. Bence bu şimdiye kadarki en iyi versiyon:
call_user_func(
'array_walk',
array(key1 => val1,
key2 => val2,
),
function($val, $key) use ($foo) { });