如何格式化数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何格式化数组相关的知识,希望对你有一定的参考价值。

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

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

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

答案

您可以使用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"

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

如果你需要上面数组的输出,这是一个例子: https://3v4l.org/Y6OKk

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

这将输出:

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

LOCN: benton 
 NAME: sue - 2 
 NAME: bob - 30 
另一答案

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

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

然后根据需要迭代数据。

另一答案

您可以像这样转换数据:

$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 . "
";
    $names = array_keys($salesArr);
    sort($names);
    foreach($names as $name) {
        echo '  ' . $name . '  ' . $salesArr[$name] . "
";
    }
}

输出:

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

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

以上是关于如何格式化数组的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段10—— 数组的响应式方法

我应该如何使用 Outlook 发送代码片段?

如何将此 JavaScript 代码片段翻译成 Parenscript?

如何从片段内的列表视图打开链接网址?

如何从我的 DatePicker 片段中传输格式化的日期字符串?

为什么我不能在此片段中生成唯一对象数组?