Добрых суток. Решил в курсаче по кластеризации изъвернуться и таки сам описать работу алгоритма k-средних на своем кривом php. Заступорился. На том, при добавлении эл-та L:133 (при этом, "очистки" массивов-"кластеров"), элемент добавляется в позицию после удаленных, т.е. ключи наподобие [0],[1],[4].. notice: это добро бродит в бесконечном цикле. Код (Text): <form method="POST" action=""> Введите кол-во элементов <input type="text" name="num"> <input type="submit" name=""> </form> <?php $n = (isset($_POST['num'])) ? $_POST['num'] : 3; $arrInput = array(); for ($i=0; $i < $n; $i++) { $tmp = array(); $arrayName = array((rand(0,100)/100) ,(rand(0,100)/100)); array_push($tmp, $arrayName); array_push($tmp, 0); array_push($arrInput, $tmp); } $clusters = array( 1 => array(0 => array((rand(0,100)/100), (rand(0,100)/100))), 2 => array(0 => array((rand(0,100)/100), (rand(0,100)/100))), 3 => array(0 => array((rand(0,100)/100), (rand(0,100)/100))) ); echo "<table border='1' cellpadding='5' style='margin: 20px 10px'><tr><td>инпуты!!</td></tr>"; foreach ($arrInput as $key => $value) { echo "<tr>"; echo "<td> {$value[0][0]} </td>"; echo "<td> {$value[0][1]} </td></tr>"; } echo "</table>"; echo "<table border='1' cellpadding='5' style='margin: 20px 10px'><tr><td>Клустеры!</td></tr>"; foreach ($clusters as $key => $value) { echo "<tr>"; echo "<td> {$value[0][0]} </td>"; echo "<td> {$value[0][1]} </td></tr>"; } echo "</table>"; $differenceArray = array(); //Флаг перемещения $isSwap = 1; $i=1; while ($isSwap) { foreach ($clusters as $key => $cluster) { echo "<pre>"; var_dump($cluster); for ($j =1; $j<=count($cluster); $j++) if(count($cluster)!=1) {unset($clusters[$key][$j]);} } echo "<pre><hr>"; var_dump($clusters); $isSwap = 0; echo "<h2> Итерация№ $i </h2>"; foreach ($arrInput as $key => $value) { $tempArray = $value[0]; $tableNumber = $key+1; echo "<table border='1' cellpadding='10' style='margin: 20px 10px'>"; echo '<thead>Метрика расстояний для объекта наблюдения X'.$tableNumber.'<tr><td></td> <td>Расстояние по координате Х</td><td>Расстояние по координате Y</td><td>Эвклидово расстояние</td></tr></thead>'; $tmpCompare = 2;$tmpCompare*=1000; foreach ($clusters as $key1 => $value1) { echo "<tr>"; echo "<td> Объект X $tableNumber и центроид кдластера{$key1}"; //Расчет среднего if(count($value1)>1 && $i!=1) //если в массиве лежит что-то помимо центроида -> считаем все, кроме центроида { $meanX = 0; $meanY = 0; foreach ($value1 as $key2 => $value2) { if($key2!=0) { $meanX+= $value2[0]; $meanY+= $value2[1]; } } $meanX/=count($value1)-1; $meanY/=count($value1)-1; echo "<h4>Новый центр кластера: $meanX ; $meanY</h4>"; var_dump($value1); $value1[$key1][0] = $meanX; $value1[$key1][1] = $meanY; var_dump($value1); } } $tempArrayCentr = $value1[0]; // $diffX = pow($tempArray[0] - $tempArrayCentr[0],2); echo "<td>{$tempArray[0]} - {$tempArrayCentr[0]} = {$diffX} </td>"; $diffY = pow($tempArray[1] - $tempArrayCentr[1],2); echo "<td>{$tempArray[1]} - {$tempArrayCentr[1]} = {$diffY} </td>"; $diff = sqrt($diffY+$diffX)*1000; echo "<td> {$diffX} + {$diffY} = {$diff} </td>"; if((int)$diff<(int)$tmpCompare) { $tmpCompare = $diff; $kluch = $key1; if($value[1]!=0) { if($value[1]!=$kluch) $isSwap=1; } $value[1]=$kluch; } } echo "Помещаем $tempArray в массив кластеров ($kluch)"; array_push($clusters[$kluch], $tempArray); /*echo "<pre><hr>"; var_dump($clusters);*/ } echo "</table>"; /* echo "<pre><hr>"; var_dump($clusters);*/ $i++; } echo "</table>"; echo "<h1>ALL DONE !!! </h1><pre><hr>"; var_dump($clusters);
А ты хочешь, чтобы ключи в реальном времени пересчитывались типа? Массивы в пхп - это частный случай хитровыбоенных хэшмап. Они, де факто, всегда ассоциативные. А у ассоциативного массива нет корреляции между ключем и реальным положением ячейки.