数组映射关系一对多怎么解决 php,将数组映射到多个数组[重复]

一。

GROUP BY

一键

此函数的作用如下

分组依据

$identifier

)是可能的。

function arrayUniqueByIdentifier(array $array, string $identifier)

{

$ids = array_column($array, $identifier);

$ids = array_unique($ids);

$array = array_filter($array,

function ($key, $value) use($ids) {

return in_array($value, array_keys($ids));

}, ARRAY_FILTER_USE_BOTH);

return $array;

}

此函数用于筛选“行”。如果我们说,二维数组是一个表,那么它的每个元素都是一行。所以,我们可以用这个函数删除重复的行。如果两行(第一维度的元素)的所有列(第二维度的元素)都相等,则这两行(第一维度的元素)相等。对“column”值的比较适用:如果一个值是

type

array

,

object

,

resource

unknown type

)将被使用。

策略很简单:从原始数组中创建一个浅数组,其中元素是

implode

d原始数组的“列”;然后应用

array_unique(...)

最后使用检测到的id过滤原始数组。

function arrayUniqueByRow(array $table = [], string $implodeSeparator)

{

$elementStrings = [];

foreach ($table as $row) {

// To avoid notices like "Array to string conversion".

$elementPreparedForImplode = array_map(

function ($field) {

$valueType = gettype($field);

$simpleTypes = ['boolean', 'integer', 'double', 'float', 'string', 'NULL'];

$field = in_array($valueType, $simpleTypes) ? $field : $valueType;

return $field;

}, $row

);

$elementStrings[] = implode($implodeSeparator, $elementPreparedForImplode);

}

$elementStringsUnique = array_unique($elementStrings);

$table = array_intersect_key($table, $elementStringsUnique);

return $table;

}

对象

这个

$implodeSeparator

应该有点复杂,z.B。

spl_object_hash($this)

.

三。检测表(二维数组)具有唯一标识符列的行

这个解决方案依赖于第二个解决方案。现在完整的“行”不需要是唯一的。两个“行”(第一个维度的元素)现在相等

相关的

“相关的”“字段”是“字段”(第二维度的元素),它们具有键,等于传递的“标识符”的元素之一。

function arrayUniqueByMultipleIdentifiers(array $table, array $identifiers, string $implodeSeparator = null)

{

$arrayForMakingUniqueByRow = $removeArrayColumns($table, $identifiers, true);

$arrayUniqueByRow = $arrayUniqueByRow($arrayForMakingUniqueByRow, $implodeSeparator);

$arrayUniqueByMultipleIdentifiers = array_intersect_key($table, $arrayUniqueByRow);

return $arrayUniqueByMultipleIdentifiers;

}

function removeArrayColumns(array $table, array $columnNames, bool $isWhitelist = false)

{

foreach ($table as $rowKey => $row) {

if (is_array($row)) {

if ($isWhitelist) {

foreach ($row as $fieldName => $fieldValue) {

if (!in_array($fieldName, $columnNames)) {

unset($table[$rowKey][$fieldName]);

}

}

} else {

foreach ($row as $fieldName => $fieldValue) {

if (in_array($fieldName, $columnNames)) {

unset($table[$rowKey][$fieldName]);

}

}

}

}

}

return $table;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值