Nasıl her madde PHP ile kolayca bir dizi çarpabilirsiniz?

4 Cevap php

I $times adında bir dizi var. Bu küçük bir sayı listesi (15,14,11,9,3,2). Bu kullanıcı sunulacak ve dakika olması gerekiyordu. PHP zaman saniye çalışır gibi, ben 60 benim dizinin her öğesi çarpmak istiyorum.

I array_walk ve array_map ile oynamak oldum ama ben bu çalışma alamıyorum: S

Teşekkürler.

4 Cevap

Sadece iterate foreach deyimi ve çarpma ile dizi üzerinde:

foreach ($times as $value) {

  $new_times[] = $value * 60;

}

Sen kullanabilirsiniz array_map:

array_map () her biri için arama fonksiyonu uygulandıktan sonra dizi1 tüm öğeleri içeren bir dizi döndürür. Geri çağırma işlevi kabul parametrelerinin sayısı array_map geçirilen dizilerin sayısını eşleşmesi () olmalıdır

Geri aramalar için lambda fonksiyonları örnekler:

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

PHP

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

Veya bcmul geri arama için

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

Ama sadece bu yanı için foreach kullanarak yanlış bir şey yoktur.

Sizin durumda basitlik için foreach kullanmak isteyebilirsiniz:

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

Ben dizinin değerleri çarpmak istediğiniz olanları değil, anahtarlar olduğunu varsayalım. Yukarıdaki çözüm referanslar kullanır gibi, aynı zamanda orijinal diziyi değiştirmez olacak - ama hedefleyen olduğu gibi array_map önce, ben bunu istiyorum düşünüyorum.

The solution above is probably easier to understand and most likely faster than using array_map which (obviously) has to call a function for each element. I'd use array_map only for more complicated things such as advanced sorting algorithms and so on, but definitely not for something as trivial as this.

Ben şahsen ikinci Gordon öneri sadece bir lambda (veya oluşturulan) işlevini kullanmak istiyorum ve birini yapın:

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 ben diziyi çoğaltmak için hiçbir nedenleri (değerlerin yeri söz konusu ise hantal olabilir) bakın; Ayrıca, dikkatli onunla çalışmaya değilseniz foreach (ki ben ikinci kullanışlı olabilir) kullanılarak da tehlikeli olabilir dikkat ... ve onunla her zaman başa çıkmak için hatırlamak zorunda çünkü o bakım (zaten zor olabilir siz) bu kodu çalışır. Eğer bu aşamada optimize etmek için hiçbir nedenleri (IE uygulama hız değil sorunları var) varsa, şimdi bunu yapmayın ve array_map kullanma konusunda endişelenmeyin. Artık bakım kolaylığı düşünmek ve durumda gerçekten gerek, daha sonra optimize edebilirsiniz.

Eğer referans gitmek ve sonra tekrar foreach kullanırsanız Aslında, beklenmeyen sonuçlar adım (aşağıdaki örneğe bakın ...) olabilir

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

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

Çıktı:

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

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

Probably not what you expect on the second cycle. This is why I usually avoid the foreach & byref combo when I can.