A lightweight associative array library for PHP.
AssociativeArray requires 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'),
]);
Result:
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,
)
Get rows of selected columns.
$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());
Result:
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,
),
)
Filter the rows using the given callback.
$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);
Result:
array (
0 =>
array (
'id' => 1001,
'category' => 'C',
'price' => 30,
),
1 =>
array (
'id' => 1002,
'category' => 'A',
'price' => 25,
),
)
Inner join rows
$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);
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',
),
)
Left join rows
$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);
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,
),
)
Right join rows
$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);
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,
),
)
Order by keys
$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);
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,
),
)
Keep index
$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);
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,
),
)
Groups an associative array by keys.
$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);
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,
),
),
),
)
Create a new associative array instance.
$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());
Result:
array (
'id' => 1001,
'category' => 'C',
'price' => 10,
)
Return the first row
$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());
Result:
array (
'id' => 1001,
'category' => 'C',
'price' => 10,
)
Return the last row
$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());
Result:
array (
'id' => 1003,
'category' => 'B',
'price' => 10,
)
Count the number of rows in the associative array.
$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());
Result:
3
Get the sum of a given key.
$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'));
Result:
45
Get the average value of a given key.
$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'));
Result:
15
Get the instance as an array.
$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());
Result:
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]);
Result:
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;
}
Result:
C
A
B
AssociativeArray is released under the MIT Licence. See the bundled LICENSE file for details.