Okay, try this. Afterwards you have an array with each key once and an array of all ids but every id maximum once. You could implode() the ids array with # if you want a string again.
<?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 */