SOLUTION:
Instead of adding the field to PERSONS, I added put it in ASSOCS:
p_id a_id p_to_a a_to_p info
1 2 employs worked for "info..."
1 3 knows knows (null)
3 4 worked with worked with (null)
SELECT a.p_id, a.a_id,
CONCAT(p1.fname,' ', p1.lname) as name1,
p_to_a,
CONCAT(p2.fname,' ', p2.lname) as name2, a.info
FROM assocs a
INNER JOIN persons p1 ON p1.person_id = a.p_id
INNER JOIN persons p2 ON p2.person_id = a.a_id
the output ($nf, 'info' => $nf, $data[$pid]['info'], $adata['info']):
$data = [];
$res = $db->query($sql);
while (list($pid, $aid, $n1, $ass, $n2, $nf) = $res->fetch_row()) {
if (!isset($data[$pid])) {
$data[$pid] = [ 'name' => $n1, 'assocs' => [], 'info' => $nf ];
}
$data[$pid]['assocs'][$aid] = ['name' => $n2, 'rel' => $ass, 'info' => $nf];
}
$processed=[];
function listAssociates($pid, &$data, &$processed, $level)
{
if (!isset($data[$pid])) {
return;
}
if (in_array($pid, $processed)) return; // prevent circular references
$processed[] = $pid;
if ($level==0) {
if ($data[$pid]['info'] != '') {
echo "<div class=''>{$data[$pid]['name']}</b></div><div style='margin-left:0px;'>{$data[$pid]['info']}</div>";
} else {
echo "<div class=''>{$data[$pid]['name']}</b> ยป </div>";
}
}
// $indent = str_repeat(' ', $level*10);
$indent = ($level*25);
$indent = ($indent+25)."px";
foreach ($data[$pid]['assocs'] as $aid=>$adata) {
echo "<div style='margin-left:$indent'>{$adata['info']}</div><div style='margin-left:$indent'>{$adata['rel']} <b>{$adata['name']}</b></div>\n";
listAssociates($aid, $data, $processed, $level+1);
}
}