Bir seferde bir dizi 1/3 öğeleri üzerinde etkili

5 Cevap

I (aynı zamanda içinde 7, 10 ya da 11 ürün olabilir) içinde 22 madde bulunan bir dizi var

Eski, berbat bir örnek: $anArray = array(1=>'A',2=>'B',3=>'C',4=>'D',5=>'E',6=>'F',7=>'G',8=>'H',9=>'I');

Better example:

Array(
[25] => #
[50] => #
[53] => #
[55] => #
[56] => #
[57] => #
[58] => #
[59] => #
[60] => #
[61] => #
[62] => #
[63] => #
[64] => #
[65] => #
[66] => #
[67] => #
[68] => #
[69] => #
[70] => #
[71] => #
[72] => #
[73] => #)

Ben de üç değişken vardır:

$A='A'; $B='B'; $C='C';

I need change the first 1/3(*ish) of the items in the array from what they are to $A ...the 2nd third to $B ...and the final third to $C

Eski, berbat bir örnek: Array([1]=>A [2]=>A [3]=>A [4]=>B [5]=>B [6]=>B [7]=>C [8]=>C [9]=>C)

Better example:

Array(
[25] => A
[50] => A
[53] => A
[55] => A
[56] => A
[57] => A
[58] => A
[59] => B
[60] => B
[61] => B
[62] => B
[63] => B
[64] => B
[65] => B
[66] => B
[67] => C
[68] => C
[69] => C
[70] => C
[71] => C
[72] => C
[73] => C)

Bunu yapmanın bir kolay ve düz ileri bir yolu var mı? Sağ şimdi, vb sayaçları ile foreach çok yapıyorum .. ve çok çalışma gibi görünüyor.

Ayrıca ... tuşları üzgünüm ... değiştiremezsiniz.

* ISH derken yaklaşık üçte demek - 7-8-7 veya 7-7-8 iyi çalışır

5 Cevap

$c = intval(count($ary) / 3);

$result = 
    array_fill(1, $c, 'A') + 
    array_fill($c + 1, $c, 'B') + 
    array_fill($c * 2 + 1, $c, 'C');

Tamam, anahtarlar korunarak

$ary = array(11=>'A',22=>'B',33=>'C',44=>'D',55=>'E',66=>'F',77=>'G',88=>'H',99=>'I',123=>'x',456=>'y',); 

$cc = count($ary);
$c1 = intval($cc / 3);
$c2 = intval(($cc - $c1) / 2);
$c3 = $cc - ($c1 + $c2);

$result = array_combine(
    array_keys($ary),
    array_fill(0, $c1, 'A') + 
    array_fill($c1, $c2, 'B') + 
    array_fill($c1 + $c2, $c3, 'C'));

print_r($result);

Bu gerçek bir fonksiyonu olarak herhangi bir mantıksal kullanımı olan göremiyorum çünkü bu okul için olmalıdır.

Her neyse, bunu yapmak için daha kolay bir yolu dizinin uzunluğunu hesaplamak ve sonra değişken bir döngü için bir single kullanarak bu belirli bir pozisyon için kullanılması gereken hangi hesaplamak için. Her değeri değişecektir eğer değerleri değiştirmek için gerek yok, o zaman kaybıdır.

$vals = array("A", "B", "C");
for ($i = 0; $i < count($array); $i++) {
    $newarray[$i] = $vals[floor($i/3)];
}

Edit: Üzgünüm önceki Sadece 9 için ... Ben olsa farklı uzunluklarda için bunu anlamaya eminim edildi.

array_replace($an_array,array_merge(
  array_pad($a,count($an_array)/3),
  array_pad($b,count($an_array)/3),
  array_pad($c,count($an_array)/3)
));

A muhtemelen biraz çarpılmış, ve count($an_array) 3 ile bölünebilir değilse onu istediğiniz gibi çalışır, ama for eşdeğer muhtemelen daha iyi olmaz.

Belki böyle bir şey:

<?php

$array = array(
'2'=>'',
'3'=>'',
'5'=>'',
'8'=>'',
'9'=>'',
'13'=>'',
'55'=>'',
'24'=>'',
'16'=>'',
'37'=>'',
'86'=>'',
'45'=>'',
'32'=>'',
'35'=>'',
'37'=>'',
'26'=>'',
'29'=>'',
'87'=>'',
'68'=>'',
'69'=>'',
'60'=>'',
'65'=>'',
'43'=>'',
'23'=>'',
);

$aPart = array(1=>'A',2=>'B',3=>'C');
$thispart = 1;

$total = count($array);
$part = round($total / 3);

$count = 0;
foreach($array as $idx => $val){
    $count++;
    if($count >= $part){
        $thispart++;
        $count=0;
    }
    $array[$idx] = $aPart[$thispart];
}

print_r($array);

Benim print_r() çıkışı:

Array
(
    [2] => A
    [3] => A
    [5] => A
    [8] => A
    [9] => A
    [13] => A
    [55] => A
    [24] => B
    [16] => B
    [37] => B
    [86] => B
    [45] => B
    [32] => B
    [35] => B
    [26] => B
    [29] => C
    [87] => C
    [68] => C
    [69] => C
    [60] => C
    [65] => C
    [43] => C
    [23] => C
)