【问题标题】:Generate unique ids for all column values in a multi-dimensional array为多维数组中的所有列值生成唯一 ID
【发布时间】:2017-05-10 00:40:30
【问题描述】:

我有一个如下所示的文件:

Papiers peints > 3D et Perspective > 3D
Papiers peints > Carte du monde
Papiers peints > Fleurs
Papiers peints > Fleurs > Coquelicots
Tableaux > Cartes du monde
Tableaux > Fleurs
Tableaux > Fleurs > Coquelicots

然后我将其转换为格式正确的 csv,如下所示:

"Papiers peints","3D et Perspective","3D"
"Papiers peints","Carte du monde",
"Papiers peints","Fleurs",
"Papiers peints","Fleurs","Coquelicots"
"Tableaux","Cartes du monde",
"Tableaux","Fleurs",
"Tableaux","Fleurs","Coquelicots"

我需要让这些字段中的每一个都有自己的唯一 ID,该 ID 必须是整数。应该是这样的

"Papiers peints",101,"3D et Perspective",1001,"3D",10001
"Papiers peints",101,"Carte du monde",1002,,
"Papiers peints",101,"Fleurs",1003,,
"Papiers peints",101,"Fleurs",1003,"Coquelicots",10002
"Tableaux",102,"Cartes du monde",1004,,
"Tableaux",102,"Fleurs",1005,,
"Tableaux",102,"Fleurs",1005,"Coquelicots",10003

名称本身并不重要,而且总会有重复的。 我可以通过上传到数据库轻松解决这个问题。 然后我做:

  • select distinct COL1,给他们各自的 ID
  • select COL2, group by COL1, COL2,给他们各自的ID
  • select COL3, group by COL1, COL2,COL3,给他们各自的 ID
  • 根据需要重复多次,这可能会很多

如何在 PHP 中执行此操作而无需使用数据库? 一个直接的答案会很好,但即使是设计理念也会有很大帮助。

我的文件中最多可以有 10 列,但这里有一个简化的输入数组可以使用:

$new=[0=>['a0','a1','a2','a3'],1=>['b0','b1','b2','b3'],2=>['c0','c1','c2','c3'],3=>['d0','d1','d2','d3'],4=>['e0','e1','e2','e3']];

预期结果:

[
    ['a0','101','a1','1001','a2','10001','a3','100001'],
    ['b0','102','b1','1002','b2','10002','b3','100002'],
    ['c0','103','c1','1003','c2','10003','c3','100003'],
    ['d0','104','d1','1004','d2','10004','d3','100004'],
    ['e0','105','e1','1005','e2','10005','e3','100005']
]

【问题讨论】:

  • 我觉得你的问题相当难以理解。请展示您自我解决的最佳尝试。请提供所有必要的输入以生成所需的输出。请编辑您的问题,使其不会被标记为“不清楚”。
  • 最好删除并重新开始,可能。并为无法理解而感到抱歉。这是一个相当复杂的问题。
  • 如果您愿意,可以这样做,但编辑您的答案并不丢人。您的问题没有标记或否决票。最好把它都留在这里。我会留意更新的问题。
  • 完成了。我更新了请求,希望现在很清楚。虽然看起来我没有做任何工作,我通常会尽量避免过于宽泛的问题。我仍然认为数组会解决这个问题,我只是不知道我应该用它们做什么。
  • 您的更新现在大大改善/清晰。我确信我可以帮助您找到有效的解决方案。我可以问一下您的第二个代码 sn-p (带有双引号但没有递增的 ID)吗?这是一个数组吗?还是带有换行符的字符串?保存此数据的变量的名称是什么?这些答案将帮助我为您编写一个在您的项目中立即有用的方法。 (今天是母亲节周末,所以我不知道我会有多空闲——我有一个家庭——但我会尽快提供答案。)

标签: php arrays multidimensional-array increment array-column


【解决方案1】:

如果这是我的项目,我可能会考虑在从文件中提取数据时准备必要的值。我将使用$new 数组作为输入(我在测试时修改了一些值)。

代码(Demo):

$new=[0=>['a0','a1','a2','a3'],1=>['a0','b1','b2','b3'],2=>['c0','b1','c2','c3'],3=>['d0','d1','c2','d3'],4=>['e0','e1','e2','f3']];

// OP says could be up to 10 columns...
for($x=0; $x<10; ++$x){
    $index_base=pow(10,2+$x)+1;         // or replace pow() with ** if php >=5.6
    // echo $x," : ",$index_base,"\n";  // uncomment if you want to see the values created
    $unique_col_val_keys[$x]=
        array_map(
            function(&$v)use($index_base){  // &$v means modify the input array's values
                return $v+$index_base;    // update the incremented ids (values) using $index_base
            },
            // the following 4 functions generate the input array to map
            array_flip(                   // swap keys and values within the array
                array_values(             // reset keys
                    array_unique(         // remove duplicate column values
                        array_column(
                            $new,$x       // get set of values from each column of multi-dim array
                        )
                    )
                )
            )
        );
}
//var_export($unique_col_val_keys);  // uncomment if you want to see the generated indexes

foreach($new as $row=>$a){
    if(!isset($result[$row])){$result[$row]=[];}
    foreach($a as $col=>$v){
        // echo "$row $col $v : {$unique_col_val_keys[$col][$v]}\n";
        array_push($result[$row],$v,"{$unique_col_val_keys[$col][$v]}");
    }
}
var_export($result);

输出:

array (
  0 => 
  array (
    0 => 'a0',
    1 => '101',
    2 => 'a1',
    3 => '1001',
    4 => 'a2',
    5 => '10001',
    6 => 'a3',
    7 => '100001',
  ),
  1 => 
  array (
    0 => 'a0',
    1 => '101',
    2 => 'b1',
    3 => '1002',
    4 => 'b2',
    5 => '10002',
    6 => 'b3',
    7 => '100002',
  ),
  2 => 
  array (
    0 => 'c0',
    1 => '102',
    2 => 'b1',
    3 => '1002',
    4 => 'c2',
    5 => '10003',
    6 => 'c3',
    7 => '100003',
  ),
  3 => 
  array (
    0 => 'd0',
    1 => '103',
    2 => 'd1',
    3 => '1003',
    4 => 'c2',
    5 => '10003',
    6 => 'd3',
    7 => '100004',
  ),
  4 => 
  array (
    0 => 'e0',
    1 => '104',
    2 => 'e1',
    3 => '1004',
    4 => 'e2',
    5 => '10004',
    6 => 'f3',
    7 => '100005',
  ),
)

【讨论】:

  • @flish 我已经将这个可行的解决方案拼凑在一起(我认为它可以满足您的需求)。如果有任何不必要或缺少的组件,请说明应该更改的内容,以便我可以为您提供最有效的方法。例如,如果您不需要一直到第 10 列的自动递增 id,请告诉我需要自动生成 id 的最后一列。 ...乐于助人——这很有趣。
  • 非常感谢。我很高兴这对你来说很有趣:) 这对我来说是一个“casse-tête”。它看起来也很好,这是一个优雅的解决方案。我应该更多地使用数组而不是 sql 来处理我遇到的任何文件的生命——我知道我做得还不够。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多