PHP - 识别并标记相关的子数组


PHP - identify and tag related child arrays

所以我有一个多维数组。
每个子数组都包含一个 ID 值...1+ 个 ID,由哈希分隔。

array(
    array('name'=>'this', 'ids'=>'x'),
    array('name'=>'this', 'ids'=>'x#y'),
    array('name'=>'this', 'ids'=>'x#y#z'),
    array('name'=>'this', 'ids'=>'y'),
    array('name'=>'this', 'ids'=>'z#b#a'),
    array('name'=>'this', 'ids'=>'d'),
    array('name'=>'this', 'ids'=>'e'),
    array('name'=>'this', 'ids'=>'f#g'),
    array('name'=>'this', 'ids'=>'d#g')
)

现在,如您所见,其中一些具有共同的ID...但有时它是多个,有时只是 n 中的 1 个,或者没有。
我需要做的是为每个子数组添加一个 Key,如果它们相关,则具有相同的 Key。

因此;

array(
    array('key'=>'1', 'name'=>'this', 'ids'=>'x'),
    array('key'=>'1', 'name'=>'this', 'ids'=>'x#y'),
    array('key'=>'1', 'name'=>'this', 'ids'=>'x#y#z'),
    array('key'=>'2', 'name'=>'this', 'ids'=>'y'),
    array('key'=>'1', 'name'=>'this', 'ids'=>'z#b#a'),
    array('key'=>'3', 'name'=>'this', 'ids'=>'d'),
    array('key'=>'4', 'name'=>'this', 'ids'=>'e'),
    array('key'=>'3', 'name'=>'this', 'ids'=>'f#g'),
    array('key'=>'3', 'name'=>'this', 'ids'=>'d#g')
)

这样我就可以很容易地找到所有相关/匹配的项目。

注意:那些键=3的条目......这就是把我搞砸的一点。一个简单的foreach不会完成这项工作。我尝试遍历原始数组,查看是否设置了 Key,如果没有,请创建一个......然后提取 ID 并将它们分配给具有该密钥的新数组。但我似乎从未抓住"后退的举动"。

不 - 没有代码,因为到目前为止我管理的只是一个简单的 foreach 和新的 key->ID 数组,它失败得很惨。

我已经搜索了 - 但似乎没有任何方法可以解决这个问题(我觉得很奇怪,因为我认为将产品添加到数据库等很常见)。

好的,试试这个。之后,你有一个数组,每个键一次,一个包含所有 id 的数组,但每个 id 最多一次。如果你想要一个字符串,你可以用 # 来内爆 ids 数组。

<?php
$data = array(
    array('name'=>'this', 'ids'=>'x'),
    array('name'=>'this', 'ids'=>'x#y'),
    array('name'=>'this', 'ids'=>'x#y#z'),
    array('name'=>'this', 'ids'=>'y'),
    array('name'=>'this', 'ids'=>'z#b#a'),
    array('name'=>'this', 'ids'=>'d'),
    array('name'=>'this', 'ids'=>'e'),
    array('name'=>'this', 'ids'=>'f#g'),
    array('name'=>'this', 'ids'=>'d#g')
);
$keyedData = array();
foreach($data as $k => $r) {
    $newArr = $r;
    $newArr['key'] = $k;
    $newArr['related_to'] = array();
    $idArr = explode('#', $r['ids']);
    foreach($idArr as $id) {
        foreach($data as $kkey => $kd) {
            if(strpos($kd['ids'], $id) === false)
                continue;
            $newArr['related_to'][] = $kkey;
        }
        $newArr['related_to'] = array_unique($newArr['related_to']);
    }
    $keyedData[] = $newArr;
}
echo'<pre>'; var_dump($keyedData);
/* EOF */