Каковы Практические Различия Между “партнером” и “индексированными” Массивами в PHP?

Это работает хорошо на меня. Взятый от здесь .

 // calculates intersection and checks for parallel lines.  
 // also checks that the intersection point is actually on  
 // the line segment p1-p2  
 Point findIntersection(Point p1,Point p2,  
   Point p3,Point p4) {  
   float xD1,yD1,xD2,yD2,xD3,yD3;  
   float dot,deg,len1,len2;  
   float segmentLen1,segmentLen2;  
   float ua,ub,div;  

   // calculate differences  
   xD1=p2.x-p1.x;  
   xD2=p4.x-p3.x;  
   yD1=p2.y-p1.y;  
   yD2=p4.y-p3.y;  
   xD3=p1.x-p3.x;  
   yD3=p1.y-p3.y;    

   // calculate the lengths of the two lines  
   len1=sqrt(xD1*xD1+yD1*yD1);  
   len2=sqrt(xD2*xD2+yD2*yD2);  

   // calculate angle between the two lines.  
   dot=(xD1*xD2+yD1*yD2); // dot product  
   deg=dot/(len1*len2);  

   // if abs(angle)==1 then the lines are parallell,  
   // so no intersection is possible  
   if(abs(deg)==1) return null;  

   // find intersection Pt between two lines  
   Point pt=new Point(0,0);  
   div=yD2*xD1-xD2*yD1;  
   ua=(xD2*yD3-yD2*xD3)/div;  
   ub=(xD1*yD3-yD1*xD3)/div;  
   pt.x=p1.x+ua*xD1;  
   pt.y=p1.y+ua*yD1;  

   // calculate the combined length of the two segments  
   // between Pt-p1 and Pt-p2  
   xD1=pt.x-p1.x;  
   xD2=pt.x-p2.x;  
   yD1=pt.y-p1.y;  
   yD2=pt.y-p2.y;  
   segmentLen1=sqrt(xD1*xD1+yD1*yD1)+sqrt(xD2*xD2+yD2*yD2);  

   // calculate the combined length of the two segments  
   // between Pt-p3 and Pt-p4  
   xD1=pt.x-p3.x;  
   xD2=pt.x-p4.x;  
   yD1=pt.y-p3.y;  
   yD2=pt.y-p4.y;  
   segmentLen2=sqrt(xD1*xD1+yD1*yD1)+sqrt(xD2*xD2+yD2*yD2);  

   // if the lengths of both sets of segments are the same as  
   // the lenghts of the two lines the point is actually  
   // on the line segment.  

   // if the point isn’t on the line, return null  
   if(abs(len1-segmentLen1)>0.01 || abs(len2-segmentLen2)>0.01)  
     return null;  

   // return the valid intersection  
   return pt;  
 }  

 class Point{  
   float x,y;  
   Point(float x, float y){  
     this.x = x;  
     this.y = y;  
   }  

   void set(float x, float y){  
     this.x = x;  
     this.y = y;  
   }  
 }  

7
задан Alan Storm 25 August 2009 в 19:10
поделиться

4 ответа

Наиболее распространенный вариант, который приходит на ум, - это то, что индексированный массив можно перебрать с помощью традиционного цикла for , а ассоциативный - нет (потому что он не имеет числовые индексы):

for ($i = 0; $i < count($indexed_array); $i++)
{
  // do something with $indexed_array[$i]
}

Конечно, php также имеет ключевое слово foreach , которое работает одинаково для обоих типов.

3
ответ дан 6 December 2019 в 19:40
поделиться

Фактически, любой массив, независимо от того, индексирован он или ассоциативен, является хеш-таблицей (плюс двусвязный список для поддержания порядка элементов) в PHP. Однако в пользовательском PHP-коде индексированные и ассоциативные массивы почти всегда служат разным целям, и иногда их нужно обрабатывать по-разному, поэтому некоторые функции, такие как sort / asort , различают их. просто для удобства.

5
ответ дан 6 December 2019 в 19:40
поделиться

.. а есть SplFixedArray , начиная с версии 5.3, он поддерживает только целочисленные индексы, имеет фиксированный размер и обычно быстрее, чем собственные массивы.

3
ответ дан 6 December 2019 в 19:40
поделиться

Практически все основные функции сортировки (со всеми вариантами sort , ksort , asort ) в зависимости от того, используете ли вы хотите сохранить ключевую ассоциацию и так далее).

0
ответ дан 6 December 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: