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.