nick-lai/关联数组

PHP的一个轻量级关联数组库。

v2.2.0 2019-12-11 03:16 UTC

This package is auto-updated.

Last update: 2024-09-11 14:36:47 UTC


README

Build Status codecov Maintainability Scrutinizer Code Quality PHP 7 ready Packagist Total Downloads

PHP的一个轻量级关联数组库。

目录

要求

AssociativeArray 需要 PHP >= 7.0.0

安装

composer require nick-lai/associative-array

基本用法

use NickLai\AssociativeArray;

$data = [
    ['id' => 1001, 'category' => 'C', 'price' => 20],
    ['id' => 1002, 'category' => 'B', 'price' => 15],
    ['id' => 1003, 'category' => 'A', 'price' => 15],
    ['id' => 1004, 'category' => 'A', 'price' => 25],
    ['id' => 1005, 'category' => 'B', 'price' => 10],
];

$associativeArray = new AssociativeArray($data);

var_export([
    'first' => $associativeArray->first(),
    'last' => $associativeArray->last(),
    'count' => $associativeArray->count(),
    'sum(price)' => $associativeArray->sum('price'),
    'avg(price)' => $associativeArray->avg('price'),
]);

结果

array (
  'first' =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 20,
  ),
  'last' =>
  array (
    'id' => 1005,
    'category' => 'B',
    'price' => 10,
  ),
  'count' => 5,
  'sum(price)' => 85,
  'avg(price)' => 17,
)

select()

获取所选列的行。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 30],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->select(['id', 'price'])->toArray());
var_export($associativeArray->select(['category', 'price'])->toArray());

结果

array (
  0 =>
  array (
    'id' => 1001,
    'price' => 30,
  ),
  1 =>
  array (
    'id' => 1002,
    'price' => 25,
  ),
  2 =>
  array (
    'id' => 1003,
    'price' => 10,
  ),
)

array (
  0 =>
  array (
    'category' => 'C',
    'price' => 30,
  ),
  1 =>
  array (
    'category' => 'A',
    'price' => 25,
  ),
  2 =>
  array (
    'category' => 'B',
    'price' => 10,
  ),
)

where()

使用给定的回调过滤行。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 30],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

$result = $associativeArray->where(function ($row) {
    return $row['price'] > 10;
})->toArray();

var_export($result);

结果

array (
  0 =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 30,
  ),
  1 =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
  ),
)

innerJoin()

内连接行

$associativeArray = new AssociativeArray([
    1001 => ['id' => 1001, 'category' => 'C', 'price' => 30],
    1002 => ['id' => 1002, 'category' => 'A', 'price' => 25],
    1003 => ['id' => 1003, 'category' => 'B', 'price' => 10],
    1004 => ['id' => 1004, 'category' => 'X', 'price' => 60],
]);

$categories = [
    'A' => ['category' => 'A', 'desc' => 'A desc'],
    'B' => ['category' => 'B', 'desc' => 'B desc'],
    'C' => ['category' => 'C', 'desc' => 'C desc'],
    'D' => ['category' => 'D', 'desc' => 'D desc'],
];

$result = $associativeArray->innerJoin($categories, function ($leftRow, $rightRow) {
    return $leftRow['category'] === $rightRow['category'];
})->toArray();

var_export($result);

结果

array (
  1001 =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 30,
    'desc' => 'C desc',
  ),
  1002 =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
    'desc' => 'A desc',
  ),
  1003 =>
  array (
    'id' => 1003,
    'category' => 'B',
    'price' => 10,
    'desc' => 'B desc',
  ),
)

leftJoin()

左连接行

$associativeArray = new AssociativeArray([
    1001 => ['id' => 1001, 'category' => 'C', 'price' => 30],
    1002 => ['id' => 1002, 'category' => 'A', 'price' => 25],
    1003 => ['id' => 1003, 'category' => 'B', 'price' => 10],
    1004 => ['id' => 1004, 'category' => 'X', 'price' => 60],
]);

$categories = [
    'A' => ['category' => 'A', 'desc' => 'A desc'],
    'B' => ['category' => 'B', 'desc' => 'B desc'],
    'C' => ['category' => 'C', 'desc' => 'C desc'],
    'D' => ['category' => 'D', 'desc' => 'D desc'],
];

$result = $associativeArray->leftJoin($categories, function ($leftRow, $rightRow) {
    return $leftRow['category'] === $rightRow['category'];
})->toArray();

var_export($result);

结果

array (
  1001 =>
  array (
    'id' => 1001,      
    'category' => 'C', 
    'price' => 30,     
    'desc' => 'C desc',
  ),
  1002 =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
    'desc' => 'A desc',
  ),
  1003 =>
  array (
    'id' => 1003,
    'category' => 'B',
    'price' => 10,
    'desc' => 'B desc',
  ),
  1004 =>
  array (
    'id' => 1004,
    'category' => 'X',
    'price' => 60,
    'desc' => NULL,
  ),
)

rightJoin()

右连接行

$associativeArray = new AssociativeArray([
    1001 => ['id' => 1001, 'category' => 'C', 'price' => 30],
    1002 => ['id' => 1002, 'category' => 'A', 'price' => 25],
    1003 => ['id' => 1003, 'category' => 'B', 'price' => 10],
    1004 => ['id' => 1004, 'category' => 'X', 'price' => 60],
]);

$categories = [
    'A' => ['category' => 'A', 'desc' => 'A desc'],
    'B' => ['category' => 'B', 'desc' => 'B desc'],
    'C' => ['category' => 'C', 'desc' => 'C desc'],
    'D' => ['category' => 'D', 'desc' => 'D desc'],
];

$result = $associativeArray->rightJoin($categories, function ($leftRow, $rightRow) {
    return $leftRow['category'] === $rightRow['category'];
})->toArray();

var_export($result);

结果

array (
  'A' =>
  array (
    'category' => 'A',
    'desc' => 'A desc',
    'id' => 1002,
    'price' => 25,
  ),
  'B' =>
  array (
    'category' => 'B',
    'desc' => 'B desc',
    'id' => 1003,
    'price' => 10,
  ),
  'C' =>
  array (
    'category' => 'C',
    'desc' => 'C desc',
    'id' => 1001,
    'price' => 30,
  ),
  'D' =>
  array (
    'category' => 'D',
    'desc' => 'D desc',
    'id' => NULL,
    'price' => NULL,
  ),
)

orderBy()

按键排序

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

$result = $associativeArray->orderBy(['price', 'category'], ['desc', 'asc'])->toArray();

var_export($result);

结果

array (
  0 =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
  ),
  1 =>
  array (
    'id' => 1003,
    'category' => 'B',
    'price' => 10,
  ),
  2 =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 10,
  ),
)

保留索引

$associativeArray = new AssociativeArray([
    'X' => ['id' => 1001, 'category' => 'C', 'price' => 10],
    'Y' => ['id' => 1002, 'category' => 'A', 'price' => 25],
    'Z' => ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

$result = $associativeArray->orderBy('category', 'asc', true)->toArray();

var_export($result);

结果

array (
  'Y' =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
  ),
  'Z' =>
  array (
    'id' => 1003,
    'category' => 'B',
    'price' => 10,
  ),
  'X' =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 10,
  ),
)

groupBy()

根据键分组关联数组。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'B', 'price' => 30],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 30],
    ['id' => 1004, 'category' => 'A', 'price' => 30],
]);

$result = $associativeArray->groupBy(['category', 'price']);

var_export($result);

结果

array (
  'B' => 
  array (
    30 => 
    array (
      0 => 
      array (
        'id' => 1001,
        'category' => 'B',
        'price' => 30,
      ),
      1 => 
      array (
        'id' => 1003,
        'category' => 'B',
        'price' => 30,
      ),
    ),
  ),
  'A' => 
  array (
    25 => 
    array (
      0 => 
      array (
        'id' => 1002,
        'category' => 'A',
        'price' => 25,
      ),
    ),
    30 => 
    array (
      0 => 
      array (
        'id' => 1004,
        'category' => 'A',
        'price' => 30,
      ),
    ),
  ),
)

make()

创建一个新的关联数组实例。

$data = [
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
];

var_export(AssociativeArray::make($data)->first());

结果

array (
  'id' => 1001,
  'category' => 'C',
  'price' => 10,
)

first()

返回第一行

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->first());

结果

array (
  'id' => 1001,
  'category' => 'C',
  'price' => 10,
)

last()

返回最后一行

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->last());

结果

array (
  'id' => 1003,
  'category' => 'B',
  'price' => 10,
)

count()

计算关联数组中的行数。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->count());

结果

3

sum()

获取给定键的总和。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->sum('price'));

结果

45

avg()

获取给定键的平均值。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->avg('price'));

结果

15

toArray()

将实例作为数组获取。

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray->toArray());

结果

array (
  0 =>
  array (
    'id' => 1001,
    'category' => 'C',
    'price' => 10,
  ),
  1 =>
  array (
    'id' => 1002,
    'category' => 'A',
    'price' => 25,
  ),
  2 =>
  array (
    'id' => 1003,
    'category' => 'B',
    'price' => 10,
  ),
)

数组访问

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

var_export($associativeArray[0]);

结果

array (
  'id' => 1001,
  'category' => 'C',
  'price' => 10,
)

可遍历的

$associativeArray = new AssociativeArray([
    ['id' => 1001, 'category' => 'C', 'price' => 10],
    ['id' => 1002, 'category' => 'A', 'price' => 25],
    ['id' => 1003, 'category' => 'B', 'price' => 10],
]);

foreach ($associativeArray as $row) {
    echo $row['category'] . PHP_EOL;
}

结果

C
A
B

许可证

AssociativeArray 在 MIT 许可证下发布。有关详细信息,请参阅附带 LICENSE 文件。