一次对数组中的项目进行1/3的操作

时间:2010-04-08 00:16:53

标签: php

我有一个包含22个项目的数组(它也可能包含7个,10个或11个项目)

古老而蹩脚的例子: $ anArray = array(1 =>'A',2 =>'B',3 =>'C',4 =>'D',5 = > 'E',6 => 'F',7 => 'G',8 => 'H',9 => 'I');

更好的例子:

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

我还有三个变量:

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

我需要将数组中项目的前1/3(* ish)从它们更改为$ A ...第二个三分之一到$ B. ......最后三分之一到$ C

古老而蹩脚的例子:数组([1] => A [2] => A [3] => A [4] => B [5] => B [6 ] => B [7] => C [8] => C [9] => C)

更好的例子:

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)

这样做有简单直接的方法吗?现在,我正在用计数器等做很多事情......而且似乎还有很多工作要做。

另外......钥匙无法改变......抱歉。

* by ish我的意思是大约三分之一 - 7-8-7或7-7-8可以正常工作

5 个答案:

答案 0 :(得分:1)

这必须是针对学校的,因为我看不出这有任何合理的用途作为一个真正的功能。

无论如何,更简单的方法是计算数组的长度,然后使用单个for循环计算哪个变量需要用于该特定位置。如果每一个值都会被改变,就没有必要替换值,这是浪费时间。

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

编辑:很抱歉以前只有9 ...我相信你可以找出不同长度的。

答案 1 :(得分:1)

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

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

好的,保留了密钥

$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);

答案 2 :(得分:0)

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)
));

有点扭曲,如果count($an_array)不能被3整除,可能不会像你想要的那样工作,但可能比for当量更好。

答案 3 :(得分:0)

您可能对array_chunk

感兴趣

答案 4 :(得分:0)

也许,这样的事情:

<?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);

我的print_r()输出:

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
)