【问题标题】:How to format array如何格式化数组
【发布时间】:2018-03-03 19:54:52
【问题描述】:

我正在尝试读取包含销售数据(名称、位置和金额)的文件。每个文件用于不同的人,但可以包含多个条目。当我从磁盘读取它们时,我会得到如下信息:

第 1 步:

    Array (
        [0] => sue
        [1] => salem
        [2] => 30
    )

    Array (
        [0] => bob
        [1] => salem
        [2] => 10
    )

    Array (
        [0] => sue
        [1] => benton
        [2] => 2
    )

    Array (
        [0] => bob
        [1] => benton
        [2] => 30
    )

第2步:我需要将上面的转换成这个数组:

    Array (
        [0] => array (
                [name] => sue
                [locn] => salem
                [sales] => 30
                ) 
        [1] => array (
                [name] => bob
                [locn] => salem
                [sales] => 10
                )
        [2] => array (
                [name] => sue
                [locn] => benton
                [sales] => 2
                )    
        [3] => array (
                [name] => bob
                [locn] => benton
                [sales] => 30
                )
    ) 

然后我会像这样遍历那个数组:

    for ($i = 0; $i < count($sales_array); $i += 2) { 
      echo 'LOCN: ' . $sales_array[$i]['locn'];
      echo ' NAME: ' . $sales_array[$i]['name'] . ' - ' . $sales_array[$i]['sales'];
      echo ' NAME: ' . $sales_array[$i+1]['name'] . ' - ' . $sales_array[$i+1]['sales'];
    }   

想法是得到这个结果:

    LOCN: salem   NAME: Sue - 30  NAME: Bob - 10
    LOCN: benton  NAME: Sue - 3   NAME: Bob - 30

至少有两个问题。第一个问题是从第 1 步到第 2 步。我不知道如何获得我需要的数组。

第二个问题是代码假定前两项将用于同一位置。由于我在文件中的读取方式,它们在我的测试中,但我不确定情况是否总是如此。有人会告诉我如何做到这一点或更好的方法来完成这个吗?

【问题讨论】:

  • 我已经编辑了我的答案,以防我的答案对你没有足够的帮助
  • 每个人都有自己的专栏吗?如果有50个销售人员怎么办。会不会只有 1 个叫 Sue 的人?
  • 没有一个答案是正确的吗?

标签: php arrays sorting merge


【解决方案1】:

您可以使用 array_combine 使数组具有关联性。

$keys = ["name", "locn", "sales"];
Foreach($arr as &$subarr){
    $subarr = array_combine($keys, $subarr);
}

这将遍历您的数组并将键和子数组与值组合在一起。
原始数组应作为您的“step2”。

https://3v4l.org/MuKvo


为了为您获取第二部分,我不会按照您的意愿使用阵列设置。
我会使用关联来将位置分组在每个数组中。

$keys = ["name", "locn", "sales"];
Foreach($arr as $subarr){
    $res[$subarr[1]][] = array_combine($keys, $subarr);
}

https://3v4l.org/hoOhC
输出示例

$res[salem][0][name] = "sue"

这将创建一个稍微不同的数组结构,但它会将您的城市保持在一个数组中,从而可以轻松地在 echo 部分中获得您想要的结果。

如果您需要上述数组的输出,这里有一个例子:
https://3v4l.org/Y6OKk

$prev_city ="";
foreach($res as $city => $sales_array){
    echo 'LOCN: ' . $city . " <br>\n";
    foreach($sales_array as $sales){
        echo ' NAME: ' . $sales['name'] . ' - ' . $sales['sales'] . " <br>\n";
    }
    echo "<br>\n";
}

这将输出:

LOCN: salem 
 NAME: sue - 30 
 NAME: bob - 10 

LOCN: benton 
 NAME: sue - 2 
 NAME: bob - 30 

【讨论】:

    【解决方案2】:

    如果按键位置是固定的,你可以使用下面的方法

      $sales_array = array();
      foreach($step1 As $array){
      //construct the inner array     
      $person = array("name"=>$array[0],'locn'=>$array[1],'sales'=>$array[3]);
      // add it to sales_array
      $sales_array []= $person;
      }
    

    然后根据需要遍历数据。

    【讨论】:

      【解决方案3】:

      你可以像这样转换数据:

      $x = array_reduce($input, function($carry, $item) {
          $keys = ['name', 'locn', 'sales'];
          $carry[] = array_combine($keys, $item);
          return $carry;
      }, []);
      
      print_r($x);
      

      如果数据将按任何顺序排列,那么您需要对其进行组织,以便获得所需的内容。我在做一些假设,因为你还没有说清楚。

      1. 您似乎需要按位置组织的数据
      2. 此人的姓名是唯一的。
      3. 一个人可以在多个位置。
      4. 对于每个位置,一个人只会出现在数据中一次。

      xxxxx

      $input = [
        ['Thorn', 'East', 10],
        ['Sue', 'West', 20],
        ['Sue', 'North', 30],
        ['Fenton', 'North', 12],  
        ['Sue', 'South', 40],    
        ['Bob', 'South', 17], 
        ['Marc', 'East', 11],
        ['Sam', 'West', 20],
        ['Adam', 'South', 19], 
      ];
      
      $masterData = array_reduce($input, function($carry, $row) {
          $carry[$row[1]][$row[0]] = $row[2];
          return $carry;
      }, []);
      
      //print_r($masterData);
      foreach($masterData as $location => $salesArr) {
          echo $location . "\n";
          $names = array_keys($salesArr);
          sort($names);
          foreach($names as $name) {
              echo '  ' . $name . '  ' . $salesArr[$name] . "\n";
          }
      }
      

      输出:

      East
        Marc  11
        Thorn  10
      West
        Sam  20
        Sue  20
      North
        Fenton  12
        Sue  30
      South
        Adam  19
        Bob  17
        Sue  40
      

      从此时起,您可以按照您需要的任何方式格式化数据。

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多