老徐同志 發表於 2020-4-23 19:28:00

一道无限极类 PHP 试题

<p>记某次笔试碰到的一道无限极类试题,当时时间比较紧(满满六页试题),还是手写代码,所以最终写的有点错误。记不住原题了,但是要求都知道,特此记录下来!</p>
<h1 id="试题">试题</h1>
<p>有下面一个数组:</p>
<pre><code class="language-php">$arr = [
    '小红' =&gt; [
      '张三' =&gt; null,
      '李四' =&gt; [
            '东东' =&gt; [
                '一一' =&gt; null,
                '二二' =&gt; [
                  '小明' =&gt; null
                ]
            ],
            '西西' =&gt; null,
      ],
    ],
    '小绿' =&gt; [
      '王五' =&gt; null,
      '赵六' =&gt; [
            '南南' =&gt; null,
      ],
      '孙七' =&gt; [
            '北北' =&gt; null
      ]
    ],
    '小蓝' =&gt; null
];
</code></pre>
<p>请补充函数 <code>function getUserStr($arr) {}</code> ,使之结果输出为:</p>
<pre><code>小红: 张三,李四,东东,西西,一一,二二,小明
张三: 无
李四: 东东,西西,一一,二二,小明
东东: 一一,二二,小明
一一: 无
二二: 小明
小明: 无
西西: 无
小绿: 王五,赵六,孙七,南南,北北
王五: 无
赵六: 南南
南南: 无
孙七: 北北
北北: 无
小蓝: 无
</code></pre>
<h1 id="答案">答案</h1>
<pre><code class="language-php">function getUserStr($arr) {

    // 将多级上下级关系转为二维
    function getList($arr, &amp;$data=[], $key='') {
      if ($key &amp;&amp; !array_key_exists($key, $data)) $data[$key] = [];
      if (is_array($arr)) foreach ($arr as $k =&gt; $v) {
            if ($key) $data[$key][] = $k;
            getList($v, $data, $k);
      }
      return $data;
    }
    $list = getList($arr);

    // 上下级关系对应处理
    function getUserSubordinate($list, &amp;$res, $pk, $ck) {
      $res[$pk] = array_merge($res[$pk], $list[$ck]);
      foreach ($list[$ck] as $key =&gt; $value) {
            if (array_key_exists($value, $list) &amp;&amp; count($list[$value])) {
                getUserSubordinate($list, $res, $pk, $value);
            }
      }
    }
    $res= [];
    foreach ($list as $key =&gt; $value) {
      $res[$key] = $value;
      foreach ($value as $ck =&gt; $cv) {
            if (array_key_exists($cv, $list) &amp;&amp; count($list[$cv])) {
                getUserSubordinate($list, $res, $key, $cv);
            }
      }
    }

    // 拼接字符串
    $str = '';
    foreach ($res as $key =&gt; $value) {
      $str .= $key . ': ' . ($value ? implode(',', $value) : '无') . '&lt;br&gt;';
    }
    return $str;
}
</code></pre>
<p>用了两次递归,最终输出结果没有问题,但是总感觉应该有比较简便的方法。留着以后改进吧!!|・ω・`)</p><br><br>
来源:https://www.cnblogs.com/bndong/p/12762990.html
頁: [1]
查看完整版本: 一道无限极类 PHP 试题