VictoryasHD 1
VictoryasHD
Cancan.1234 1
Cancan.1234
noisiv 1
noisiv
Manwe Work 1
Manwe Work
mavzermete 1
mavzermete
Jack.Wrestler 1
Jack.Wrestler
Best Studio 1
Best Studio
Reklam vermek için turkmmo@gmail.com

Altın Konu PHP'de array_key_exists() ile Dizi Anahtarı Kontrolü

image.jpeg


array_key_exists('key', $array) fonksiyonu, belirtilen anahtar dizide mevcutsa true, mevcut değilse false değerini döndürür. Parametre sıralamasına dikkat edilmelidir; önce aranacak anahtar, ardından dizi yazılmalıdır. Bu fonksiyonun isset() fonksiyonundan ayrıldığı temel nokta, anahtarın karşısındaki değer null olsa dahi true sonucunu vermesidir.

PHP:
<?php
$user = ['name' => 'Ada', 'email' => 'ada@example.com', 'phone' => null];

var_dump(array_key_exists('email', $user));
var_dump(array_key_exists('address', $user));
var_dump(array_key_exists('phone', $user));   // key is there, value is null

$list = ['a', 'b', 'c'];
var_dump(array_key_exists(2, $list));         // integer keys too

Eğer anahtarı değil de dizinin içindeki bir değeri aramak istiyorsanız, in_array() fonksiyonunu kullanmalısınız.

isset ve array_key_exists Arasındaki Farklar

Her iki fonksiyon da bir anahtarın varlığını denetler. Ancak değer null olduğunda farklı sonuçlar üretirler: isset() fonksiyonu null olan bir değeri "tanımlanmamış" olarak kabul ederken, array_key_exists() anahtarın dizide gerçekten yer alıp almadığını raporlar.

PHP:
<?php
$form = ['name' => 'Ada', 'nickname' => null, 'age' => 0, 'bio' => ''];

foreach (['name', 'nickname', 'age', 'bio', 'missing'] as $key) {
    printf(
        "%-9s isset: %-5s  array_key_exists: %s\n",
        $key,
        var_export(isset($form[$key]), true),
        var_export(array_key_exists($key, $form), true)
    );
}

0 ve '' (boş dizge) değerleri her iki fonksiyon için de "ayarlanmış" olarak kabul edilir; ayrımı yapan tek durum null değeridir. Hangi fonksiyonu kullanacağınız, verinizdeki null ifadesinin ne anlam taşıdığına bağlıdır:

• null değerini "değer yok" şeklinde yorumluyorsanız isset() tercih edin. Bu en yaygın kullanımdır; bir dil yapısı olduğu için daha hızlıdır ve tanımlanmamış değişkenler veya iç içe dizilerle çalışırken uyarı vermez.
• null değerinin, anahtarın hiç olmamasıyla farklı bir anlam taşıdığı durumlarda array_key_exists() kullanın. Örneğin; bir JSON alanının açıkça null olarak gönderilmesi, veritabanındaki NULL sütunları veya bir seçeneğin temizlenmek amacıyla null yapılması gibi durumlar buna örnektir.

JSON Verilerinde Eksik Alan ve Null Ayrımı

array_key_exists() fonksiyonunun gerekliliğini gösteren tipik bir örnek, JSON üzerinden kayıt güncelleyen API'lardır. Bu senaryoda, null olarak gönderilen bir alan "veriyi sil" anlamına gelirken, hiç gönderilmeyen bir alan "mevcut veriye dokunma" anlamına gelebilir. isset() fonksiyonu bu iki durumu birbirinden ayırt edemez.

PHP:
<?php
$record = ['name' => 'Ada', 'phone' => '555-0100', 'city' => 'London'];
$patch  = json_decode('{"phone": null, "city": "Paris"}', true);

foreach (['name', 'phone', 'city'] as $field) {
    if (array_key_exists($field, $patch)) {
        $record[$field] = $patch[$field];   // includes setting null
    }
}

var_dump($record);

Kodu çalıştırdığınızda, isset($patch[$field]) kullanımı durumunda telefon numarası güncellenmeden kalırdı, çünkü null değeri eksik bir alan gibi algılanırdı.

key_exists() Fonksiyonu Hakkında

key_exists(), PHP'nin eski versiyonlarından kalma bir array_key_exists() takma adıdır. Aynı argümanları alır ve aynı sonucu döndürür. Kodun okunabilirliği adına tam ismin kullanılması daha uygundur.

PHP:
<?php
$config = ['debug' => false];

var_dump(key_exists('debug', $config));
var_dump(array_key_exists('debug', $config));
var_dump(key_exists('cache', $config));

Anahtar Tipleri: "1" ve 1 Aynı Anahtardır

Dizi anahtarları ya tam sayı ya da dizge (string) tipindedir. Ancak düz bir ondalık sayı şeklinde olan dizgeler, PHP tarafından tam sayı olarak saklanır. Bu yüzden array_key_exists('1', $arr) işlemi 1 anahtarını bulur; bunun tersi de geçerlidir. Ancak '01' gibi bir değer dizge olarak kalır ve farklı bir anahtar olarak değerlendirilir.

PHP:
<?php
$byId = [1 => 'Ada', 2 => 'Linus', '07' => 'Grace'];

var_dump(array_key_exists('1', $byId));    // "1" is the int key 1
var_dump(array_key_exists(7, $byId));      // 7 is not "07"
var_dump(array_key_exists('07', $byId));

Çoklu ve İç İçe Anahtarların Kontrolü

array_key_exists() sadece tek bir seviyeye bakar. Eğer null değerinin önemi yoksa, iç içe geçmiş yollar için isset($a['x']['y']) kullanarak tüm seviyeleri tek seferde kontrol edebilirsiniz. Eğer null ayrımı önemliyse, seviyeleri tek tek gezen kısa bir yardımcı fonksiyon yazılabilir. Birden fazla anahtarın hepsinin mevcut olup olmadığını kontrol etmek için ise array_diff_key() fonksiyonu ile karşılaştırma yapabilirsiniz.

PHP:
<?php
function hasPath(array $data, array $path): bool
{
    foreach ($path as $key) {
        if (!is_array($data) || !array_key_exists($key, $data)) {
            return false;
        }
        $data = $data[$key];
    }
    return true;
}

$order = ['customer' => ['address' => ['city' => 'Lyon', 'zip' => null]]];

var_dump(isset($order['customer']['address']['zip']));          // null: false
var_dump(hasPath($order, ['customer', 'address', 'zip']));       // present: true
var_dump(hasPath($order, ['customer', 'phone']));

$required = ['name', 'email', 'password'];
$input = ['name' => 'Ada', 'email' => 'ada@example.com'];
$missing = array_keys(array_diff_key(array_flip($required), $input));
print_r($missing);

array_flip($required) işlemi, isim listesini anahtarlara dönüştürür; böylece array_diff_key() bu listeyi giriş verisinin anahtarlarıyla kıyaslayabilir. Sonuçta kalanlar, hata mesajında kullanılmaya hazır eksik alanların listesidir.

Nesneler İçin property_exists Kullanımı

PHP'nin eski sürümlerinde array_key_exists() fonksiyonu nesneleri kabul edebiliyordu, ancak PHP 8 ile birlikte bu durum TypeError hatasına yol açar. Nesnelerdeki tanımlı veya dinamik bir özelliği (değeri null olsa dahi) kontrol etmek için property_exists() kullanılmalıdır. isset($obj->prop) kullanımı ise dizilerdeki isset() mantığıyla benzer şekilde çalışır.

PHP:
<?php
class User
{
    public ?string $phone = null;
    public string $name = 'Ada';
}

$u = new User();

var_dump(property_exists($u, 'phone'));   // declared, value null
var_dump(isset($u->phone));
var_dump(property_exists($u, 'email'));

$asArray = get_object_vars($u);
var_dump(array_key_exists('name', $asArray));

Örneğin son iki satırı alternatif bir yöntem sunar: get_object_vars() fonksiyonu nesnenin erişilebilir özelliklerini bir diziye dönüştürür, böylece standart dizi fonksiyonları kullanılabilir hale gelir.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst