fiedsch/data_util

1.1.0RC1 2023-05-04 11:26 UTC

This package is auto-updated.

Last update: 2024-09-04 14:34:19 UTC


README

PHP类和辅助函数,在处理数据文件、变量名列表等时可能非常有用。

  • Data\Helper提供了一些静态辅助函数

用法

<?php
require '/path/to/vendor/autoload.php';

use Fiedsch\Data\Helper;
use Fiedsch\Data\Listmanager;
use Fiedsch\Data\ArrayRecordCreator;

// use Helper::expandExpression() et al.
// use Listmanager to perform operations on lists (arrays)
// use ArrayRecordCreator to create data records
// use Helper::columnIndex() and Helper::columnName() for column name to numerical index mappings

示例

创建变量名列表

创建变量名列表,可能有助于在您最喜欢的统计分析软件中编写代码。

print Helper::getExpression('a001', 'a111');
// 'a{001,111}'

Helper::expandExpression('a{001,111}');
// array('a001', 'a002', 'a003', ..., 'a099', 'a100', ..., 'a111')

print "someFunction(" . join(',', Helper::expandExpression('a{001,101}')) . ");";

创建文件名列表

Helper::expandExpression('image{00001,00099}.jpg');
// array('image00001.jpg', ..., 'image00099.jpg')

比较列表

注意:结果是列表,而不是集合(例如,请参阅 e.g. union()!)

$listA = ['a','b','c'];
$listB = ['c','d','e'];
$manager = new Listmanager($listA);
$result = $manager->without($listB);   // ['a', 'b']
$result = $manager->intersect($listB); // ['c']
$result = $manager->union($listB);     // ['a','b','c','c','d','e']

$manager = new Listmanager(['a','b','c','c','b']);
$result = $manager->unique(); // ['a','b','c']

// find duplicates in a list
$list = ['a','b','a','a','c'];
$manager = new Listmanager($list);
$result = $manager->duplicates(); // ['a','a']
// $list[0] is considered unique, $list[2] and $list[3] are in the result

创建数据记录

$creator = new ArrayRecordCreator(['foo','bar','baz']);
 // add values in arbitrary order
 $creator->foo = '1';
 $creator->baz = '2';
 $creator->bar = '3';
 $record = $creator->getRecord(); // [1, 3, 2]

 $creator->reset();
 $creator->foo = 'FOO';
 $record = $creator->getRecord(); // ['FOO', null, null]

Helper结合使用

 // create target columns 'col001' to 'col100'
 $creator = new ArrayRecordCreator(Helper::expandExpression('col{001,100}'));
 $creator->col042 = 'fourtytwo';
 // ...

处理从(CSV)文件读取的数据数组

如果您正在处理存储在PHP数组中的数据记录(例如,当从CSV文件读取行时),您可能希望通过“列名”而不是数字索引来访问条目。如果数据最初“存在于”Excel电子表格中,其中列名为“A”、“B”等,这将特别有用。

要将“A”、“B”等映射到相应的数组索引0、1等,可以使用

Helper::columnIndex("A"); // 0
Helper::columnIndex("B"); // 1
// ...
Helper::columnIndex("AQ"); // 42

columnIndex()的逆函数是columnName(),这可能在与列名到数组索引映射处理时也非常有用。

Helper::columnName(0); // "A"
Helper::columnName(1); // "B"
// ...
Helper::columnName(42); // "AQ"

处理列名映射

假设,您有一个将(一些)变量名映射到列名的数组

['one'=>'A', 'two'=>'C', 'three'=>'X']

(其中“一些”表示映射不必是连续的)。

现在,如果在数据管理步骤中添加了新列,您需要调整映射以匹配下一步的新数据

Helper::prependAndRemap(['one'=>'A', 'two'=>'C', 'three'=>'X'], ['four', 'five'])
// ['four'=>'A', 'five'=>'B', 'one'=>'C', 'two'=>'E', 'three'=>'Z']

处理波规格

实验性:可能在未来版本中更改!

考虑一个每年进行12次调查的情况。我们称这些“波”为'01-2023''02-2023'、...、'12-2023'

当我们想要访问“向前12波”的波名称时,我们希望从'08-2023'移动到'05-2023',例如,但'02-2023''11-2022'`也应该正确计算。

Helper::moveWave('08-2023', -3); // '05-2023'
Helper::moveWave('02-2023', -3); // '11-2023'
Helper::moveWave('10-2023', +3); // '01-2024'

使用不同的模式,如下所示

Helper::moveWave('09/2023', -3, '(\d{2})(\/)(\d{4})', Helper::ORDER_WAVE_FIRST); // '06/2023'
Helper::moveWave('2023/09', -3, '(\d{4})(\/)(\d{2})', Helper::ORDER_WAVE_LAST);  // '2023/06'