За последние 24 часа нас посетили 21703 программиста и 1020 роботов. Сейчас ищут 700 программистов ...

Дырки в массиве -_-

Тема в разделе "PHP для новичков", создана пользователем xypwa, 15 дек 2018.

  1. xypwa

    xypwa Новичок

    С нами с:
    22 май 2018
    Сообщения:
    3
    Симпатии:
    1
    Добрых суток. Решил в курсаче по кластеризации изъвернуться и таки сам описать работу алгоритма k-средних на своем кривом php.

    Заступорился. На том, при добавлении эл-та L:133 (при этом, "очистки" массивов-"кластеров"), элемент добавляется в позицию после удаленных, т.е. ключи наподобие [0],[1],[4]..


    notice: это добро бродит в бесконечном цикле.


    Код (Text):
    1. <form method="POST" action="">
    2.  
    3. Введите кол-во элементов
    4. <input type="text" name="num">
    5. <input type="submit" name="">
    6. </form>
    7. <?php
    8. $n = (isset($_POST['num'])) ? $_POST['num'] : 3;
    9.  
    10.  
    11. $arrInput = array();
    12.  
    13. for ($i=0; $i < $n; $i++) {
    14.     $tmp = array();
    15.     $arrayName = array((rand(0,100)/100) ,(rand(0,100)/100));
    16.     array_push($tmp, $arrayName);
    17.     array_push($tmp, 0);
    18.     array_push($arrInput, $tmp);
    19. }
    20.  
    21. $clusters = array(  
    22.                     1 => array(0 => array((rand(0,100)/100), (rand(0,100)/100))),
    23.                     2 => array(0 => array((rand(0,100)/100), (rand(0,100)/100))),
    24.                     3 => array(0 => array((rand(0,100)/100), (rand(0,100)/100)))
    25.                     );
    26.  
    27.  
    28. echo "<table border='1' cellpadding='5' style='margin: 20px 10px'><tr><td>инпуты!!</td></tr>";
    29. foreach ($arrInput as $key => $value) {
    30.     echo "<tr>";
    31.         echo "<td> {$value[0][0]} </td>";
    32.         echo "<td> {$value[0][1]} </td></tr>";
    33. }
    34. echo "</table>";
    35.  
    36. echo "<table border='1' cellpadding='5' style='margin: 20px 10px'><tr><td>Клустеры!</td></tr>";
    37. foreach ($clusters as $key => $value) {
    38.     echo "<tr>";
    39.         echo "<td> {$value[0][0]} </td>";
    40.         echo "<td> {$value[0][1]} </td></tr>";
    41. }
    42. echo "</table>";
    43.  
    44.  
    45. $differenceArray = array();
    46.  
    47. //Флаг перемещения
    48. $isSwap = 1;
    49. $i=1;
    50. while ($isSwap)
    51. {
    52.  
    53.     foreach ($clusters as $key => $cluster) {
    54.         echo "<pre>"; var_dump($cluster);
    55.         for ($j =1; $j<=count($cluster); $j++)
    56.             if(count($cluster)!=1)
    57.                 {unset($clusters[$key][$j]);}
    58.     }
    59.     echo "<pre><hr>";
    60.     var_dump($clusters);
    61.  
    62.     $isSwap = 0;
    63.     echo "<h2> Итерация№ $i </h2>";
    64.     foreach ($arrInput as $key => $value) {
    65.  
    66.     $tempArray = $value[0];
    67.     $tableNumber = $key+1;
    68.  
    69.     echo "<table border='1' cellpadding='10' style='margin: 20px 10px'>";
    70.     echo '<thead>Метрика расстояний для объекта наблюдения X'.$tableNumber.'<tr><td></td>
    71.     <td>Расстояние по координате Х</td><td>Расстояние по координате Y</td><td>Эвклидово расстояние</td></tr></thead>';
    72.     $tmpCompare = 2;$tmpCompare*=1000;
    73.  
    74.  
    75.         foreach ($clusters as $key1 => $value1) {
    76.             echo "<tr>";
    77.             echo "<td> Объект X $tableNumber и центроид кдластера{$key1}";
    78.  
    79.             //Расчет среднего
    80.  
    81.             if(count($value1)>1 && $i!=1) //если в массиве лежит что-то помимо центроида -> считаем все, кроме центроида
    82.             {
    83.  
    84.                 $meanX = 0;
    85.                 $meanY = 0;
    86.                 foreach ($value1 as $key2 => $value2) {
    87.                     if($key2!=0)
    88.                     {
    89.                         $meanX+= $value2[0];
    90.                         $meanY+= $value2[1];                  
    91.                     }
    92.                 }
    93.  
    94.                 $meanX/=count($value1)-1;
    95.                 $meanY/=count($value1)-1;
    96.                 echo "<h4>Новый центр кластера: $meanX ; $meanY</h4>";
    97.                 var_dump($value1);
    98.  
    99.                 $value1[$key1][0] = $meanX;
    100.                 $value1[$key1][1] = $meanY;
    101.  
    102.                 var_dump($value1);
    103.  
    104.                 }
    105.             }
    106.  
    107.  
    108.             $tempArrayCentr = $value1[0]; //
    109.  
    110.             $diffX     = pow($tempArray[0] - $tempArrayCentr[0],2);
    111.             echo "<td>{$tempArray[0]} - {$tempArrayCentr[0]} = {$diffX} </td>";
    112.  
    113.             $diffY     = pow($tempArray[1] - $tempArrayCentr[1],2);
    114.             echo "<td>{$tempArray[1]} - {$tempArrayCentr[1]} = {$diffY} </td>";
    115.  
    116.             $diff = sqrt($diffY+$diffX)*1000;
    117.             echo "<td> {$diffX} + {$diffY} = {$diff} </td>";
    118.  
    119.             if((int)$diff<(int)$tmpCompare)
    120.             {
    121.                 $tmpCompare = $diff;
    122.                 $kluch = $key1;
    123.                 if($value[1]!=0)
    124.                 {
    125.                     if($value[1]!=$kluch)
    126.                         $isSwap=1;
    127.                 }
    128.                 $value[1]=$kluch;
    129.             }
    130.  
    131.         }
    132.             echo "Помещаем $tempArray в массив кластеров ($kluch)";
    133.             array_push($clusters[$kluch], $tempArray);
    134.             /*echo "<pre><hr>";
    135.             var_dump($clusters);*/
    136.     }
    137.  
    138.     echo "</table>";
    139. /*    echo "<pre><hr>";
    140.     var_dump($clusters);*/
    141.  
    142.     $i++;
    143. }
    144. echo "</table>";
    145.         echo "<h1>ALL DONE !!! </h1><pre><hr>";
    146. var_dump($clusters);
     
    #1 xypwa, 15 дек 2018
    Последнее редактирование: 16 дек 2018
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А ты хочешь, чтобы ключи в реальном времени пересчитывались типа?
    Массивы в пхп - это частный случай хитровыбоенных хэшмап. Они, де факто, всегда ассоциативные. А у ассоциативного массива нет корреляции между ключем и реальным положением ячейки.
     
  3. xypwa

    xypwa Новичок

    С нами с:
    22 май 2018
    Сообщения:
    3
    Симпатии:
    1
    Я подумал-таки, что смогу вполне безболезненно ансетнуть элемент и запушить на то же самое место.