【问题标题】:PHP create separate arrays within nested loopPHP在嵌套循环中创建单独的数组
【发布时间】:2016-03-02 11:09:20
【问题描述】:

这是我从数据库中获取数据的嵌套 foreach 循环

while($attrib_rec = tep_db_fetch_array($attributes)) {

foreach( $options_values as $option => $options_value ){

foreach( $options_value as $options_value_key => $each_value ){

           //make separate arrays of "option"
           print 'option = '.$option.' , value = '.$each_value.'<br />';

      }
  }
}

我从这些循环中得到的输出是

option = Type , value = GOLD
option = Type , value = SILVER
option = Type , value = BRONZE
option = Purity , value = Rough
option = Purity , value = Neat
option = Purity , value = Mixed
option = Purity , value = Random
option = Model , value = Old
option = Model , value = latest
option = Model , value = GOLD 1.0
option = Model , value = GOLD 1.1
option = Model , value = GOLD 1.2
option = Model , value = GOLD 1.3

我想要实现的是将每个相同的“选项”值保存为一个数组。 例如,从上面的输出中我应该得到 3 个数组。即

$type = array('GOLD', 'SILVER', 'BRONZE');
$purity = array('Rough', 'Neat', 'mixed', 'Random');
$model = array('Old', 'Latest', 'GOLD 1.0', 'GOLD 1.1', 'GOLD 1.2', 'GOLD 1.3');

在while循环的每次迭代中,它应该根据“选项”生成数组的数量。

如果第一次在 while 循环的下一次迭代中生成 3 个数组(如本例所示),它可能会生成 2 或 4 个数组,具体取决于我从 DB 获得的相同数量的“选项”。

【问题讨论】:

  • 您正在使用嵌套的foreach 循环,它将像显示它一样显示在输出中...您可以使用过滤器或group by

标签: php arrays loops foreach nested


【解决方案1】:

目前您只是打印值而不是将其存储在数组中。你可能想把你的代码改成这样:

$options = array();

while($attrib_rec = tep_db_fetch_array($attributes)) {

    foreach( $options_values as $option => $options_value ){

        foreach( $options_value as $options_value_key => $each_value ){

            //Store each value by their collective key
            $options[$option][] = $each_value;
        }
    }
}

这将创建一个如下所示的数组:

$options = array(
    'type' => array('GOLD', 'SILVER', 'BRONZE'),
    'purity' => array('Rough', 'Neat', 'mixed', 'Random'),
    'model' => array('Old', 'Latest', 'GOLD 1.0', 'GOLD 1.1', 'GOLD 1.2', 'GOLD 1.3'),
);

你可以像这样把它放到屏幕上:

echo "<pre>".print_r($options, true)."</pre>";

这是如何工作的:

我们不是打印每个值,而是将它们放入一个多维数组中,您的每个选项都充当键,值存储在键下的数组中。值得注意的是,如果您有重复的键,这些值将被添加到同一个 $option 数组中。如果这种行为是不可取的,那么只需使用唯一标识符,如果您不需要键是关联的,则可以让数组键在每次循环迭代时递增。

如果你想得到每个值,你可以这样做:

echo "<pre>".print_r($options['purity'], true)."</pre>";

这将打印出值Rough, Neat, Mixes, Random

您可以了解更多关于多维数组here 的简单说明:

多维数组是包含一个或多个数组的数组。

【讨论】:

  • 感谢@Henders 的解释。我非常接近解决我的实际问题。我想知道如果我有单独的$type = array('GOLD', 'SILVER', 'BRONZE'); $purity = array('Rough', 'Neat', 'mixed', 'Random'); $model = array('Old', 'Latest', 'GOLD 1.0', 'GOLD 1.1', 'GOLD 1.2,'GOLD 1.3',我将如何实现嵌套的 foreach 以生成组合(每个值的图像);'我会使用foreach( $type as $base ){ foreach( $purity as $attr1 ){ foreach( $model as $attr2 ){ //72 combinations will be generated (3 * 4 * 7) } } }
【解决方案2】:

您可以使用一个简单的数组对它们进行分类。看看这个例子:

$sorted_options = array();
while($attrib_rec = tep_db_fetch_array($attributes)) {
    while($attrib_rec = tep_db_fetch_array($attributes)) {

        foreach( $options_values as $option => $options_value ){

            foreach( $options_value as $options_value_key => $each_value ){

                sorted_options[$option][] = $each_value;
            }
        }
    }
}
echo '<pre>'.print_r($sorted_options, true).'<pre>';

【讨论】:

    【解决方案3】:

    试试这个 -

        <?php
        $arr = array();
        while($attrib_rec = tep_db_fetch_array($attributes)) {
    
        foreach( $options_values as $option => $options_value ){
    
        foreach( $options_value as $options_value_key => $each_value ){
    
                   //make separate arrays of "option"
                   //print 'option = '.$option.' , value = '.$each_value.'<br />';
                   $arr[$option][]=$each_value;
              }
          }
        }
        print_r($arr);
        ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多