PHP çok boyutlu dizi manipülasyon

4 Cevap php

Bu benim dizidir

Array
(
    [0] => Array
        (
            [sample_id] => 3
            [time] => 2010-05-30 21:11:47
        )

    [1] => Array
        (
            [sample_id] => 2
            [time] => 2010-05-30 21:11:47
        )

    [2] => Array
        (
            [sample_id] => 1
            [time] => 2010-05-30 21:11:47
        )
)

Ve ben bir dizideki tüm sample_ids almak istiyorum. Birisi lütfen yardım edebilir?

(Diziler çok büyük çünkü) bu döngüler için olmadan yapılabilir.

4 Cevap

Bu BİRÇOK kez yaşadım bir sorundur. PHP dizileri düzleştirmek için kolay bir yol yoktur. Sen döngü onları başka bir dizi ekleyerek gerekir. Size özgün yapısını kullanan ve flatten gerektiren değil verilerle çalışıyoruz nasıl yeniden düşünmeye başarısız.

EDIT: benim dizide 150,000 unsurlar vardı bir dizi $data = array(array('key' => value, 'value' => other_value), ...); oluşturuldu, ben metrik biraz bilgi eklemek düşündüm. Ben daha düzleşme 3 tipik yollarını koştu

$start = microtime();
$values = array_map(function($ele){return $ele['key'];}, $data);
$end = microtime();

Bir çalışma süresi Yapımcı: Run Time: 0.304405 5 kez Koşu hemen altında 0.30 süresini ortalama

$start = microtime();
$values = array();
foreach ($data as $value) {
    $values[] = $value['key'];
}
$end = microtime();

0,165 ortalama ile Run Time: 0.167301 bir çalışma süresi üretti

$start = microtime();
$values = array();
for ($i = 0; $i < count($data); $i++) {
    $values[] = $data[$i]['key'];
}
$end = microtime();

0,355 ortalama ile Run Time: 0.353524 bir çalışma süresi üretti

Her durumda veri dizisinde bir foreach kullanarak önemli ölçüde daha hızlı oldu. Bu büyük olasılıkla hte array_map() uygulanması için dizideki her öğe için bir fonksiyon icra yükü ile ilgilidir.

Ek Düzenleme: Önceden tanımlı bir işlevi ile bu test koştu. Aşağıda 'Fly' (tanımlı inline) için 10 iterasyon üzerinde ortalama numaraları ve (string arama) 'Pre Tanımlı'.

Averages:
  On the fly: 0.29714539051056
  Pre Defined: 0.31916437149048
$ids = array_map(function($el){return $el["sample_id"];}, $array);

Veya önceki sürümlerinde:

function get_sample_id($el){return $el["sample_id"];}
$ids = array_map('get_sample_id', $array);

Ancak, bu muhtemelen daha hızlı olacak değil.

no array manitulation can be done without a loop.
if you can't see a loop, it doesn't mean it's absent. I can make a function

array_summ($array) {
  $ret=0;
  foreach ($array as $value) $ret += $value;
  return $ret;
}

ve daha sonra herhangi bir görünür döngüler olmadan array_summ($arr) diyoruz. Ama bu tarafından aldanmayın. Orada is döngü. Her php array işlevi yinelemek dizi de. Sadece bunu görmüyorum.

So, the real solution you have to look for, is not the magic function but reducing these arrays.
From where it came? From database most likely.
Consider to make a database to do all the calculations. It will save you much more time than any PHP bulit in function

Ben döngüler olmadan bunu herhangi bir şans olacak sanmıyorum. Eğer gerçekten tüm yapısını yinelemek istemiyorsanız, ben senin durumları değiştirmek için bir yol arıyor düşünün ...

Eğer büyük dizi oluşturulur aynı anda sample_id veri yapısını oluşturabilir miyim?

Eğer gerçekten sample_id girdileri bir dizi ihtiyaç, ya da emin sona sadece bir araç? Belki de sadece belirli parçaları gerektiğinde şeyi yinelemeye tutmak için bir önbellek ve bir imleç kullanan bir sınıf verileri sarmak için bir yol var?