2000条数据的数组,找到有重复值的索引. 例如 一个数组含有 1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9,...............得到 2的重复索引2,3,10,11,14 5的重复索引7,8,15 ....不能2重for或者while循环,这样代价太大. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hash 值 => key 遍历2次,输出结果 不能2重for或者while循环这是必须的 $arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$tmp = array();foreach($arr AS $k => $v){ if(isset($tmp[$v])) { if($tmp[$v]) { $tmp[$v] .= ","; } $tmp[$v] .= $k; } else { $tmp[$v] = ""; }}foreach($tmp AS $k => $v){ if($v) { echo $k, "=>", $v, "\n"; }}unset($tmp);结果:2=>2,3,10,11,143=>165=>7,8,15 $a = array( 1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$r = array();foreach($a as $v) { if(isset($r[$v])) continue; if($t = array_keys(array_intersect($a, array($v)))) { unset($t[0]); $r[$v] = join(',', $t); }}$r = array_diff($r, array(''));print_r($r);Array( [2] => 2,3,10,11,14 [3] => 16 [5] => 7,8,15) $a = array( 1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$r = array();foreach($a as $v) { if(isset($r[$v])) continue; if($t = array_keys(array_intersect($a, array($v)))) { if(!isset($t[1]))unset($t[0]); $r[$v] = join(',', $t); }}$r = array_diff($r, array('')); var_dump($r);echo "</br>"; $arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$str = implode(',', $arr);foreach ($arr as $k=>$v){ $t[$v] .= !isset($t[$v]) ? '' : $k . ','; $l += strlen($v); if((strrpos($str, $v.'')) == $l-strlen($v)) $t[$v] = trim($t[$v], ','); ++$l;}print_r($t);如果foreach两次就很简单搞定了,像#3楼的。完全没有什么影响到什么效率 如果 要求带上自己呢?那么问题就变得异常简单了$arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$t = array();foreach ($arr as $k=>$v) { if(isset($t[$v])) $t[$v] .= ",$k"; else $t[$v] = $k;} 刚毕业,php菜鸟。求学习路线 不包括自己的优化版本$arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);$t = array();foreach ($arr as $k=>$v) { if(!isset($t[$v])) $t[$v] = ''; else $t[$v] .= ($t[$v] == '' ? '' : ',') . $k;}$t = array_diff($t, array(''));print_r($t); PHP关于file_get_contens函数向本地文件传参数的问题 如何把文件连里边的文件和目录一起复制到另一位置? php循環表格 RewriteRule 参数的问题,在线等 兄弟们救命啊,谁给个详细的生成缩略图的程序,刚从.net转php菜鸟一个 PDFlib error: [2516] 如何获得服务器网卡、硬盘、cpu等信息? 如何把php4升级到php5 关于浏览器解释网页的一个奇怪问题 请教用PHP开发物业收费软件的开行性! error_reporting(E_ALL)的E_ALL属于枚举吗 discuz!开发教程
$arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);
$tmp = array();foreach($arr AS $k => $v)
{
if(isset($tmp[$v]))
{
if($tmp[$v])
{
$tmp[$v] .= ",";
}
$tmp[$v] .= $k;
}
else
{
$tmp[$v] = "";
}
}
foreach($tmp AS $k => $v)
{
if($v)
{
echo $k, "=>", $v, "\n";
}
}
unset($tmp);结果:
2=>2,3,10,11,14
3=>16
5=>7,8,15
$r = array();
foreach($a as $v) {
if(isset($r[$v])) continue;
if($t = array_keys(array_intersect($a, array($v)))) {
unset($t[0]);
$r[$v] = join(',', $t);
}
}
$r = array_diff($r, array(''));
print_r($r);Array
(
[2] => 2,3,10,11,14
[3] => 16
[5] => 7,8,15
)
$r = array();
foreach($a as $v) {
if(isset($r[$v])) continue;
if($t = array_keys(array_intersect($a, array($v)))) {
if(!isset($t[1]))unset($t[0]);
$r[$v] = join(',', $t);
}
}
$r = array_diff($r, array(''));
var_dump($r);echo "</br>";
$arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);
$str = implode(',', $arr);
foreach ($arr as $k=>$v)
{
$t[$v] .= !isset($t[$v]) ? '' : $k . ',';
$l += strlen($v);
if((strrpos($str, $v.'')) == $l-strlen($v))
$t[$v] = trim($t[$v], ',');
++$l;
}
print_r($t);
如果foreach两次就很简单搞定了,像#3楼的。完全没有什么影响到什么效率
那么问题就变得异常简单了$arr = array(1,2,2,2,3,4,5,5,5,6,2,2,7,8,2,5,3,9);
$t = array();
foreach ($arr as $k=>$v) {
if(isset($t[$v])) $t[$v] .= ",$k";
else $t[$v] = $k;
}
$t = array();
foreach ($arr as $k=>$v) {
if(!isset($t[$v])) $t[$v] = '';
else $t[$v] .= ($t[$v] == '' ? '' : ',') . $k;
}
$t = array_diff($t, array(''));
print_r($t);