array_column($rows, $column) fonksiyonu, çok boyutlu bir dizideki her satırdan yalnızca belirtilen $column değerini çekerek yeni bir dizi oluşturur. Bu işlem, bir veri tablosunu tek bir alandan oluşan düz bir listeye dönüştürür; özellikle implode, in_array, array_sum veya array_search gibi fonksiyonları kullanmadan önce bu yönteme ihtiyaç duyarsınız.
PHP:
<?php
$users = [
["id" => 3, "name" => "Ada", "email" => "ada@example.com"],
["id" => 7, "name" => "Bob", "email" => "bob@example.com"],
["id" => 9, "name" => "Cy", "email" => "cy@example.com"],
];
$emails = array_column($users, "email");
print_r($emails);
echo implode(", ", array_column($users, "name")), "\n";
İşlenecek satırlar farklı kaynaklardan gelebilir: çözümlenmiş bir JSON yanıtı, bir CSV dosyası veya veritabanı sorgusu sonucu dönen ilişkisel diziler buna örnektir.
İndeks Anahtarı Kullanarak Anahtar-Değer Çiftleri Oluşturma
Fonksiyonun üçüncü parametresi, elde edilen her sonucun anahtarı olacak alanı belirlemek için kullanılır. Örneğin
array_column($users, 'name', 'id') kullanımı, bir <select> listesi oluştururken ID değerini anahtar, ismi ise değer olarak atamanın en pratik yoludur.
PHP:
<?php
$users = [
["id" => 3, "name" => "Ada", "role" => "admin"],
["id" => 7, "name" => "Bob", "role" => "editor"],
["id" => 9, "name" => "Cy", "role" => "viewer"],
];
$names = array_column($users, "name", "id");
print_r($names);
echo $names[7], "\n";
Eğer iki farklı satır aynı indeks değerine sahipse, sonradan gelen satır öncekinin üzerine yazılır.
null Değeri ile Satırları ID'ye Göre İndeksleme
Tüm satır verilerini koruyarak diziyi belirli bir alana göre yeniden anahtarlamak isterseniz, sütun parametresi olarak
null değerini verebilirsiniz. Bu sayede bir satırı ID ile aramak için döngü kurmak yerine, doğrudan anahtar erişimi ile veriye ulaşabilirsiniz.
PHP:
<?php
$products = [
["sku" => "A12", "name" => "Lamp", "price" => 29],
["sku" => "B07", "name" => "Desk", "price" => 199],
["sku" => "C33", "name" => "Chair", "price" => 89],
];
$bySku = array_column($products, null, "sku");
$sku = "B07";
if (isset($bySku[$sku])) {
echo "{$bySku[$sku]['name']} costs {$bySku[$sku]['price']}\n";
}
print_r(array_keys($bySku));
İndeksleme işlemini bir kez yaptığınızda, sonraki tüm aramalar anlık olarak gerçekleşir; bu durum özellikle bir döngü içerisinde çok sayıda ID sorgulamanız gerektiğinde büyük performans sağlar.
array_column ve array_search Kullanarak Satır Bulma
Belirli bir değere sahip satırı tespit etmek için önce ilgili sütunu ayıklayıp ardından bu listede arama yapabilir ve dönen konumu kullanabilirsiniz. Sonucu kontrol ederken
!== false operatörünü kullanmaya dikkat edin, çünkü eşleşme ilk satırda gerçekleşirse fonksiyon 0 döndürür.
PHP:
<?php
$users = [
["name" => "Ada", "email" => "ada@example.com"],
["name" => "Bob", "email" => "bob@example.com"],
["name" => "Cy", "email" => "cy@example.com"],
];
$wanted = "bob@example.com";
$index = array_search($wanted, array_column($users, "email"));
if ($index !== false) {
echo "Found: {$users[$index]['name']} at position $index\n";
} else {
echo "No user with $wanted\n";
}
// Just checking existence
var_dump(in_array("zoe@example.com", array_column($users, "email"), true));
Bu yöntem,
$users dizisinin 0, 1, 2 gibi sıralı anahtarlara sahip olduğu varsayımıyla çalışır, çünkü array_column standart bir liste döndürür. Eğer diziniz filtrelenmişse ve anahtarlarda boşluklar varsa, işlemden önce array_values($users) fonksiyonunu çağırmalısınız.Sütun Verilerini Toplama, Sayma veya Ortalamasını Alma
array_column fonksiyonu, matematiksel işlemler yapan yardımcı fonksiyonlarla birlikte çok verimli çalışır. Önce ilgili alanı ayıklayıp ardından toplama işlemi yapabilirsiniz.
PHP:
<?php
$cart = [
["item" => "Book", "qty" => 2, "price" => 12.5],
["item" => "Pen", "qty" => 10, "price" => 1.2],
["item" => "Bag", "qty" => 1, "price" => 30.0],
];
$qtys = array_column($cart, "qty");
echo "Items: " . array_sum($qtys) . "\n";
$prices = array_column($cart, "price");
echo "Most expensive: " . max($prices) . "\n";
echo "Average price: " . round(array_sum($prices) / count($prices), 2) . "\n";
$total = array_sum(array_map(fn($row) => $row["qty"] * $row["price"], $cart));
echo "Total: $total\n";
Fiyat ve miktar gibi birden fazla alanın çarpımıyla hesaplanan değerler için ise kodu çalıştırdığınızda görebileceğiniz üzere
array_map fonksiyonu kullanılmalıdır.Nesnelerle array_column Kullanımı
Nesnelerden oluşan bir listede
array_column yalnızca public (açık) özellikleri okuyabilir; private ve protected özellikleri göremez.
PHP:
<?php
class User
{
public function __construct(
public int $id,
public string $name,
private string $password,
) {}
}
$users = [
new User(1, "Ada", "x"),
new User(2, "Bob", "y"),
];
print_r(array_column($users, "name", "id"));
var_dump(array_column($users, "password"));
Kodu çalıştırdığınızda,
password özelliği private olduğu için bu alanın atlanacağını ve fonksiyonun boş bir dizi döndüreceğini görebilirsiniz.Alanı Eksik Olan Satırların Atlanması
array_column, aranan alanın bulunmadığı satırlar için herhangi bir yer tutucu eklemez ve o satırı atlar. Bu nedenle sonuç dizisi, orijinal girdiden daha kısa olabilir ve konumlar artık orijinal satırlarla eşleşmeyebilir.
PHP:
<?php
$people = [
["name" => "Ada", "phone" => "555-0101"],
["name" => "Bob"],
["name" => "Cy", "phone" => "555-0199"],
];
print_r(array_column($people, "phone"));
// Keep the link to each person with an index key
print_r(array_column($people, "phone", "name"));
Örneğin, sonuçta iki telefon numarası varsa ancak bir kullanıcının telefonu yoksa, bu durum fark edilmeyebilir. İsimleri indeks anahtarı yaptığınızda hangi numaranın kime ait olduğunu net bir şekilde görebilirsiniz; bazı satırlarda alan eksik olabildiğinde bu yöntem daha güvenlidir.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 3
- Görüntüleme
- 8
- Cevaplar
- 1
- Görüntüleme
- 8
- Cevaplar
- 1
- Görüntüleme
- 11
- Cevaplar
- 4
- Görüntüleme
- 13
- Cevaplar
- 1
- Görüntüleme
- 8
