选择元素时,将数组视为圆形数组 - PHP

时间:2015-06-30 14:57:46

标签: php arrays

我有一个我循环的数组。我有另一个数组,我需要逐个选择它,但它需要继续循环,以防它到达数组的末尾。这里要说清楚一些代码:

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$size      = count($mainArray);
$circular  = array('A', 'B', 'C');

for($i = 0; $i < $size; $i++) {
   echo $mainArray[$i] . ' = ' . $circular[$i] . ', ';
}

现在上面的代码打印出来:

1 = A, 2 = B, 3 = C, UNDEFINED INDEX ERROR

我需要打印的是:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A

是否有PHP的内置函数将数组转换为循环数组?我想我需要使用模块化算子来实现这一目标。

4 个答案:

答案 0 :(得分:21)

获取圆形数组($circsize)的大小,然后对其修改值$i并将其用作索引:

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$size      = count($mainArray);
$circular  = array('A', 'B', 'C');
$circsize  = count($circular);

for($i = 0; $i < $size; $i++) {
   echo $mainArray[$i] . ' = ' . $circular[$i % $circsize] . ', ';
}

答案 1 :(得分:6)

我喜欢Chris Walsh,但这里是一个替代品,也适用于关联数组(非整数索引)。可能会缩短:

foreach($mainArray as $main) {
    if(($circ = current($circular)) === false) {
        $circ = reset($circular);
    }
    next($circular);
    echo "$main=$circ ";
}

如果你不止一次需要这个,可能是一个功能:

function circular(&$array) {
    if(($result = current($array)) === false) {
        $result = reset($array);
    }
    next($array);

    return $result;
}

然后使用:

foreach($mainArray as $main) {
    $circ = circular($circular);
    echo "$main=$circ ";
}

答案 2 :(得分:3)

请使用余数作为圆形数组索引:

class SearchBar extends React.Component {

  constructor() {
    super();
    this.handler = this.handler.bind(this);
  }

  handler(e){
    this.props.filterUser(e.target.value);
  }

  render () {
    return (
      <div>
        <input type='text' className='from-control search-bar' placeholder='Search' onChange={this.handler} />
      </div>
    );
  }
}


export default class User extends React.Component {
  constructor() {
    super();
    this.filterUser = this.filterUser.bind(this);
    this.state = { name: '', age: '', filter: '' };
  } 

  filterUser(filterValue){
    this.setState({
      filter: filterValue
    });
  }

  render() {
    return ( 
      <div>
        <SearchBar filterUser={this.filterUser} />
        <span>Value: {this.state.filter}</span>
      </div>
    );
  }
}

作为替代方案,您可以使用 $i2= $i % count($circular ); echo $mainArray[$i] . ' = ' . $circular[$i2] . ', '; 迭代数组并避免对索引使用算术计算:

foreach

答案 3 :(得分:0)

如果您使用 PHP 5.5 或更高版本,那么您可以利用php generators及其yield关键字:

function loopOnArrayFor($array, $limit = 1000)
{
    for ($i = 0 ; $i <= count($array) ; $i++) {
        if ( $i == count($array)) {
            if (--$limit > 0) {
                $i = 0;
            } else {
                break;
            }
        }
        yield $array[$i];
    }
}

因此,除非为$limit参数传递另一个值,否则此方法将在给定数组上循环1000次。这是用例:

foreach (loopOnArrayFor(['A','B','C'],5) as $v) {
    echo "$v ,";
}

导致以下输出:

A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C ,

稍微调整就会给我们预期的结果:

$counter = 1;
foreach (loopOnArrayFor(['A','B','C'],5) as $v) {
    echo $counter++ . ' = ' . $v .', ' ;
}

类似的东西:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A, 11 = B, 12 = C, 13 = A, 14 = B, 15 = C,

P上。 S. 你在寻找什么,很容易导致内存耗尽所以如果可以,找到另一个解决方案,而不是依赖于(受控)无限循环:)