循环遍历数组并创建一个新的数组,其中包含匹配参数名称的名称

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)){
          $values[] = $states[$i];
        }
        }
    }

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

当我运行代码并打印$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],其中 $states[$i][3] 匹配。

enter image description here

$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
@Andrew 仍然存在相同的错误。致命错误:不支持字符串的[]运算符 - hello
如果您在使用动态数组名称时,请在动态名称周围添加方括号:${$values}[] = ... 如果您仅使用单个变量,则无需使用方括号。 - Andrew
你有一个多维数组,你确定 $keys 和 $values 是来自 $unique_states 数组的正确层级吗? - Andrew
在第一个(for)循环之前,$unique_states数组的内容是什么?打印它的数据,使用print_r函数。 - Andrew
显示剩余3条评论
3个回答

1

试试这个:

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

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

详细内容请参考: PHP中的动态变量名


当我在if()循环内插入${$values} = array();时,我只得到了$states(超级数组)中的最后一个元素。当我在循环外插入时,我得到未定义的变量。 - hello
那么,你在整个大循环的结构上做错了什么。尝试将其分成较小的部分,并逐步进行。 - Andrew

1

使用array_filter可以高效地完成这个任务。

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

0

刚刚弄明白了。每当匹配到一个条件时,它就会被存储在一个新的多维数组中。

$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];
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接