如何格式化数组

时间:2018-03-03 19:54:52

标签: php arrays sorting merge

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

第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步。我无法弄清楚如何获得我需要的数组。

第二个问题是代码假设前两个项目将用于同一位置。由于我在文件中的阅读方式,它们在我的测试中,但我不确定是否总是这样。有人会告诉我如何做到这一点或更好的方法来实现这一目标,拜托?

3 个答案:

答案 0 :(得分:3)

您可以使用array_combine使数组关联。

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

循环遍历您的数组,并将键和子数组与值组合在一起 原始数组应该是&#34; step2&#34;。

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"

这将使阵列结构略有不同,但它会将您的城市保持在一个阵列中,每个阵列都可以轻松地在回声部分中获得所需的结果。

如果你需要上面数组的输出,这里有一个例子:
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 

答案 1 :(得分:0)

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

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

然后根据需要迭代数据。

答案 2 :(得分:0)

您可以像这样转换数据:

$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. 对于每个位置,一个人只会在数据中一次。
  5. 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
    

    您可以从这一点以任何方式格式化数据。