Döngü olmadan çok boyutlu dizide belirli bir "anahtar" dizisi nasıl elde edilir


115

Aşağıdaki çok boyutlu diziye sahip olduğumu varsayalım (MySQL'den veya bir hizmetten alınmış):

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

idBir " yerleşik " php işlevi çağrısında bir dizi s alabilir miyiz ? veya bir satır kod?
Geleneksel döngünün farkındayım ve değeri alıyorum ama buna ihtiyacım yok:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

Belki biraz array_map()ve call_user_func_array()sihri yapabilir.


"Bir işlev çağrısında bir dizi kimlik alabilir miyiz?" evet, ancak işlevi yazmanız gerekecek
— :)

@ BorisGuéry, yerleşik işlevleri kastetmiştim :-)
— ifaour

2
Not: foreach($users as $user) {$ids[] = $user['id'];}Tek satırda yazabileceğimin farkındayım ! ama ne demek istediğimi / ihtiyacım olduğunu biliyorsun :-)
— ifaour

@Eugene, tabii ki başka şeyler için diziye ihtiyacım var. Ve yine, bu sadece eğlenmek ve PHP'de yeni kısaltmalar öğrenmek içindir.
— ifaour

Yanıtlar:


261

Php 5.5'ten beri şunları kullanabilirsiniz array_column:

$ids = array_column($users, 'id');

Bu, herhangi bir modern projede tercih edilen seçenektir. Bununla birlikte, php> 5.5'i desteklemeniz gerekiyorsa, aşağıdaki alternatifler mevcuttur:

Php 5.3'ten beri, array_mapanonim bir işlevle kullanabilirsiniz , örneğin:

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

(Teknik olarak php 4.0.6+) öncesinde , create_functionbunun yerine anonim bir işlev oluşturmalısınız :

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);

güzel, şimdi function ($ar) {return $ar['id'];}anahtarın dönüş değerine benzer bir yerel işlev varsa bu harika olurdu! :-)
— ifaour

1
pekala, bu bir "hepsi bir arada" işlevi değil, ancak Kapatma (Anynonymous functions) bu tür işlemler için kullanılabilecek çok güçlü bir kavramdır, onları nasıl kullanacağınızı bilmek isteyeceksiniz.
— Boris Guéry

Ya anahtarı ben de almak istersem? Diyelim ki: $ arr = ['top' => ['sepet' => 5]]; Almak istiyorum: $ ball = ['top' => 5];
— Angger

2
@Angger O zaman bundan farklı bir sorunuz var. Hangi davranışı beklediğinizi ayrıntılı olarak belirttiğiniz sürece, örneğin girdi ise ne ile sonuçlanacağını sormakta özgürsünüz ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
— phihag

PHP7.4'ten beri array_mapbir ok işlevi ile kullanabilirsiniz :$ids = array_map(fn ($ar) => $ar['id'], $users);
— user3601546

13

PHP 5.5+

PHP5.5 + 'dan itibaren kullanabileceğiniz array_column ()' a sahipsiniz, bu da aşağıdakilerin tümünü geçersiz kılar.

PHP 5.3+

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

@Phihag çözümü, PHP 5.3.0'dan başlayarak PHP'de kusursuz bir şekilde çalışacaktır, bundan önce desteğe ihtiyacınız varsa, wp_list_pluck'u kopyalamanız gerekecektir.

PHP <5.3

Wordpress 3.1+

Wordpress'te wp_list_pluck adında bir işlev vardır Eğer probleminizi çözen Wordpress kullanıyorsanız.

PHP <5.3

Wordpress kullanmıyorsanız , kod açık kaynak olduğundan, kodu kopyalayıp projenize yapıştırabilirsiniz (ve işlevi, array_pick gibi tercih ettiğiniz bir şeye yeniden adlandırabilirsiniz). Kaynağı burada görüntüleyin


3

Dizideki idilk anahtar ise, bu yapacak:

$ids = array_map('current', $users);

Yine de buna güvenmemelisiniz. :)


-1

array_reduce()Daha işlevsel bir yaklaşım tercih ederseniz de kullanabilirsiniz.

Örneğin:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

Ya da süslü olmayı seviyorsanız

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

Bu ve yukarıdaki tüm yöntemler perde arkasında döngü oluşturur;)


İlk örneğiniz bir dizi döndürmeyecek, yalnızca dizideki $ user ['name'] için bulunan son değeri. $ Carry'ye itmeniz / eklemeniz ve giderken $ Carry'yi iade etmeniz gerekir.
— Progrock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.