【问题标题】:Looping through array and creating a new array with the name of the parameter matched遍历数组并创建一个与参数名称匹配的新数组
【发布时间】:2014-06-11 12:40:03
【问题描述】:

我正在尝试遍历一个多维数组,如果条件匹配,则该数组的所有元素都应存储到一个以匹配条件命名的新数组中。

     $unique_states = array_unique($allstates);
       $total = count($states);
       for($i = 0; $i < $total; $i++){
        foreach($unique_states as $keys =>  $values){
             if(($states[$i][3] == $values)){
          $values[] = $states[$i];
        }
        }
    }

$states 是包含所有内容的巨型数组。当我遍历数组时,如果匹配此条件if(($states[$i][3] == $values)),则应创建一个名为$values 的新数组。

当我运行代码和print_r($values) 时,我得到Fatal error: [] operator not supported for strings。当我将名称更改为完全不同的名称时,我只需在 $states 中获取所有数组。

不知道该怎么做。

编辑:

当我删除foreach 循环并像这样插入$values 的实际值时

  if(($states[$i][3] == 'state1')){
          $states1[] = $states[$i];
        }

  if(($states[$i][3] == 'state2')){
          $states2[] = $states[$i];
        }

效果很好。但是在我有多个状态的情况下,上面的代码将不够高效,并且每次添加新状态时都需要我进行更改。 我需要返回一个包含整个元素的数组..即 $states[$i][3] 匹配的 $s​​tates[$i]。

来自 $states 输入的数据示例:

Array
(
[0] => Array
    (
        [0] => firstname1
        [1] => lastname1
        [2] => Armstrong Landscaping
        [3] => state1
        [4] => email1
        [5] => address1
    )

[1] => Array
    (
        [0] => firstname2
        [1] => lastname2
        [2] => Armstrong Landscaping
        [3] => state1
        [4] => email2
        [5] => address2
    )

[2] => Array
    (
        [0] => firstname3
        [1] => lastname3
        [2] => Armstrong Landscaping
        [3] => state1
        [4] => email3
        [5] => address3
    )

[3] => Array
    (
        [0] => firstname4
        [1] => lastname4
        [2] => Cannon Heathcare Center
        [3] => state2
        [4] => email4
        [5] => address4
    )

[4] => Array
    (
        [0] => firstname5
        [1] => lastname5
        [2] => Cannon Heathcare Center
        [3] => state2
        [4] => email5
        [5] => address5
    )

示例输出应如下所示

Array
(
[state1] => Array
    (
        [0] => Array
            (
                [0] => firstname1
                [1] => lastname1
                [2] => Armstrong Landscaping
                [3] => state1
                [4] => email1
                [5] => address1
            )

        [1] => Array
            (
                [0] => firstname2
                [1] => lastname2
                [2] => Armstrong Landscaping
                [3] => state1
                [4] => email2
                [5] => address2
            )

Array
(
[state2] => Array
    (
        [0] => Array
            (
                [0] => firstname1
                [1] => lastname1
                [2] => Armstrong Landscaping
                [3] => state2
                [4] => email1
                [5] => address1
            )

        [1] => Array
            (
                [0] => firstname2
                [1] => lastname2
                [2] => Armstrong Landscaping
                [3] => state2
                [4] => email2
                [5] => address2
            )

【问题讨论】:

  • 如果 $values 等于,例如,'thevalue',那么你正在做的是:thevalue[] = $states[$i],这是错误的。所以你需要在开头添加 '$' 或者换句话说 $$values[] = $states[$i]
  • @Andrew 同样的错误仍然存​​在。 Fatal error: [] operator not supported for strings
  • 如果您对数组使用动态名称,请在动态名称周围添加括号:${$values}[] = ... 如果您只使用单个变量,则不需要括号跨度>
  • 您有一个多维数组,您确定 $keys 和 $values 来自 $unique_states 数组的正确级别吗?
  • $unique_states 数组的内容是什么?就在第一个(for)循环之前, print_r 它是数据

标签: php arrays


【解决方案1】:

试试这个:

${$values} = array();
${$values}[] = $states[$i];

用于输出:print_r(${$values});

详情请阅读:Dynamic variable names in PHP

【讨论】:

  • 当我在if() 循环中插入`${$values} = array();` 时,我只得到$states..(巨型数组)中的最后一个元素。当我在循环之外插入时,我得到未定义的变量。
  • 那么你的整个巨型循环的结构有问题。尝试拆分成更小的部分,一步一步进行
【解决方案2】:

这可以通过array_filter 高效完成

//ussing inline function requires PHP 5.3
$values = array_filter($states, function($state) {
   return (in_array($state[3], $unique_states));
});

【讨论】:

    【解决方案3】:

    刚刚想通了。当每个条件匹配时,它被存储在一个新的多维数组中。

    $unique_states = array_unique($allstates);
          $total = count($states);
          for($i = 0; $i < $total; $i++){
              foreach($unique_states as $keys =>  $values){
                if($states[$i][3] ==$values){
                   $new[$values][$i] = $states[$i];
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多