2010-04-17 26 views
9

I $times olarak adlandırılan bir dizi vardır. Küçük sayıların bir listesidir (15,14,11,9,3,2). Bu kullanıcılar gönderilecek ve dakika olması gerekiyordu. PHP zamanı saniyeler içinde çalıştığı için, dizilimimin her bir öğesini 60'a kadar çoğaltmak isterim.Bir dizideki her bir öğeyi PHP ile nasıl kolayca çoğaltabilirim?

array_walk ve array_map ile oynuyorum ama çalışmayı başaramıyorum. çarpın foreach deyimi ile dizinin üzerinde

+0

Sana * * 60'a diziyi çarparak yerine 60'a PHP zamanı bölmek değil kabul var, henüz foreach veya özel işlevler kullanmak istemiyorsanız Gordon sağlanan array_map/bcmul çözüm için giderdim ? –

+0

Tüm örnekleri deneyeceğim, sadece gelecekte nasıl yapılacağını biliyorum. Foreach döngü en basit gibi görünüyor. * = ve *? Arasındaki fark nedir? – Henryz

+0

Henryz: $ a * = 6, $ a = $ a * 6 şeklindeki kısa biçimidir. 6 – lamas

cevap

7

Sadece yinelerler:

foreach ($times as $value) { 

    $new_times[] = $value * 60; 

} 
+1

Bu, yapmaya çalıştığım şey için çok iyi çalıştı, teşekkürler. – Henryz

22

kullanabilirsiniz array_map:

array_map() uygulandıktan sonra arr1 tüm öğelerini içeren bir dizi döndürür her biri için geri arama işlevi. 5.3

array_map(create_function('$el', 'return $el * 60;'), $input); 
PHP < için

array_map(function($el) { return $el * 60; }, $input); 

aynı: geri arama işlevi kabul parametrelerinin sayısı array_map() geri aramalar için lambda fonksiyonları ile

Örnekler geçirilen diziler sayısını aynı olmalıdır geri arama için

Veya ile bcmul

array_map('bcmul', $input, array_fill(0, count($input), 60)); 

Ama aynı zamanda bunun için foreach kullanarak yanlış bir şey yoktur.

5

Sen durumda basitlik için foreach kullanmak isteyebilirsiniz:

foreach($times as &$val){ $val *= 60; } 

Ben senin dizinin değerler çarpın isteyenler değil anahtarları olduğunu varsayalım. Yukarıdaki çözüm referansları kullandığından, orijinal dizininizi de değiştirecektir - ama daha önce array_map'u hedeflediğiniz için bunu istediğinizi düşünüyorum.

yukarıdaki çözüm muhtemelen anlamak ve büyük olasılıkla daha hızlı (besbelli) her öğe için bir işlevi çağırmak zorundadır array_map kullanmaktan daha kolaydır. Ben bu kadar önemsiz bir şey için kesinlikle böyle böyle devam ileri sıralama algoritmaları gibi daha karmaşık şeyler için sadece array_map kullanabilirsiniz, ancak ederim.

3

Şahsen ikinci Gordon öneri sadece lambda (veya oluşturulan) işlevini ve ya do kullanmak istiyorum:

array_map(function($el) { return $el * 60; }, $input_array); 

(PHP> = 5.3) veya

array_map(create_function('$el', 'return $el * 60;'), $input_array); 

(PHP < 5,3)

Kesinlikle değerlerin çok katılmaktadırlar if() hantal hale gelebilir dizi çoğaltma için herhangi nedenlerini görmek; Eğer dikkatlice ile çalışma değilseniz de, (Ben ikinci kullanışlı olabilir) foreach kullanarak da tehlikeli olduğunu dikkat ... ve her seferinde başa hatırlamak zorunda çünkü o bakım (neyse yıldırıcı olabilir o kod üzerinde çalışıyorsunuz).Bu aşamada optimizasyon yapmak için herhangi bir nedeniniz yoksa (IE uygulamanızın hız sorunu yok), şimdi yapmayın ve array_map kullanma konusunda endişelenmeyin. Bakım kolaylığı hakkında düşünebilir ve gerçekten ihtiyacınız olduğunda daha sonra optimize edebilirsiniz.

başvuruyla gidip sonra tekrar foreach kullanırsanız Aslında, beklenmedik sonuçlara adım olabilir (aşağıdaki örneğe bakın ...)

$a=array('1','2','3'); 

foreach ($a as &$v) { 
     $v *= 60; 
} 
print_r($a); 
foreach ($a as $v); 
print_r($a); 

Çıktı geçerli:

Dizisi ( [0] => 60 [1] => 120 [2] => 180 )

Dizi ( [0] => 60 [1] => 120 [2] => 120 )

Muhtemelen hayır ne ikinci döngüsünde bekliyoruz. Bu yüzden, olabildiğince genellikle foreach & byref'ten kaçındım.

+0

Merhaba, cevabınız için teşekkürler, bu sadece böyle v = [] gibi yeni bir dizi inşa eğer işe görünüyordu. Emin değilim neden: S – Henryz

2
array_walk($myArray, function(&$v) {$v *= 60;}); 
+0

Bu kod pasajı [bir açıklama dahil] [http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) sorunu çözebilir iken, gerçekten geliştirmek için yardımcı olur Gönderinizin kalitesi. İleride okuyucuları için soruya cevap olduğunu hatırlayın ve bu kullanıcıların da kod öneri nedenlerini bilmiyor olabilir. - [İncelemeden] (https://stackoverflow.com/review/low-quality-posts/11668559) – Ferrybig

İlgili konular