Bonsoir chef    ;o)

thx again for helping me

In fact i think the solution you gave me isn t not much faster as the while
loop i use for the moment...
and the execution speed is my only problem...

well in fact i think i haven t be very clear with the goal i need to get.
let me detail this to you frm the beginning to the end...

i ve a table as follows:

naffaire   |   ncpte
    1        |       3
    2        |       5
    7        |       9
    5        |       6
    2        |       5
    6        |       9
    4        |       2
    1        |       3
    4        |       2
    7        |       9
    4        |       2
    9        |       7
    7        |       9
    4        |       2
    5        |       6
    4        |       2
... and 1 million lines like that...

naffaire and ncpte are linked : there can only be one ncpte for a naffaire,
if you find a 7 as naffaire with 9 as ncpte all the lines containing 7 as
naffaire will have 9 as ncpte. BUT the opposite of this relation is not true
: a ncpte can be associated with different naffaire. (as you can see in the
previous example at the lines 3, 6, 10...

what i do with this table is a count on the number of couple of
naffaire/ncpte and the only parameter return with my query is the count (not
the naffaire or the ncpte...), no matter the datas, i juste need to work
with their occurences...

well, now for the examle detail previously the query gives me

RESULT OF                                             TABLE WHERE
THE QUERY                                      THE QUERY IS DONE

 count(*)                                                  naffaire   |
ncpte
     2                                                             1
|       3
     2                                                             2
|       5
     3                                                             7
|       9
     2                                                             5
|       6
     2                                                             2
|       5
     1                                                             6
|       9
     5                                                             4
|       2
     2                                                             1
|       3
     5                                                             4
|       2
     3                                                             7
|       9
     5                                                             4
|       2
     1                                                             9
|       7
     3                                                             7
|       9
     5                                                             4
|       2
     2                                                             5
|       6
     5                                                             4
|       2
... and 1 million lines like that...


So i get a 2 dimension array with only one column and 1 million rows...
the fact is what i need is to count the occurrences for each result in this
array.
So for the same example we would get :
occurrence of 1 : 2
occurrence of 2 : 6
occurrence of 3 : 3
occurrence of 4 : null
occurrence of 5 : 5
...

to do this in an array there's an easy and light way : array_count_values.
the problem is that this function only works on the first dimension of the
array.
That s why i have to return my column of result into a line
I did it with this loop:

while($row = mysql_fetch_array($result)) {
    array_push($suite, $row["count(*)"]);
}

It works fine... of course and then i make the array count values on $suite
and i get
$suite[1] : 2
$suite[2] : 6
$suite[3] : 3
$suite[4] : unset
$suite[5] : 5
(max length with a 1 million row table about 25 indexes, so this array
should be quite small)

Just to go to the very end of my need, even if its not useful:
then i divide the values by their index (i gonna tell you what for)
so the final result is :
$suite[1] : 2                         /1   ====>  2
$suite[2] : 6                         /2   ====>  3
$suite[3] : 3                         /3   ====>  1
$suite[4] : unset                   /////////////////////
$suite[5] : 5                         /5   ====>  1
(as the previous array was small this one is too ;o)    )

Well you know everything : now it will be easier for me to tell you what i
want to calculate :
THE NUMBER OF COUPLES of naffaire/ncpte that have an occurence of 1, that
have an occurrence of 2, of 3, of 4....

so thereare only 2 long processes : the while loop (it won t be much shorter
if i use a "for" loop)
and the array_count_values (this one is a single instruction so i trust php
developpers for the optimization of their code ;o)  )

You will have understand my prob now : the very very big loss of time in my
algorythm is the while loop...
That s why i would like to do the same whithout using any kind of loop
before the array_count_values, before this instruction, the array is far too
big.
I would win a lot of execution time.... help please i m sure there must be a
solution but i m lost...

Hope i managed to be clear.

Thanx for your help

Etienne

----- Original Message -----
From: "DL Neil" <[EMAIL PROTECTED]>
To: "Etienne DURAND" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Thursday, January 31, 2002 11:47 PM
Subject: Re: [PHP-DB] how to reverse a hudge multidimensional array?


> Bon soir Etienne,
>
> Like I say, "Inverting" an array is a chore, it's far easier to invert the
pointers...
> but if you must do it:-
>
> For loop to control the first dimension using $i
>   For loop to control the second dimension using $j
>     $temp = $array[ $i ][ $j ];
>     $array[ $i ][ $j ] = $array[ $j ][ $i ];
>     $array[ $j ][ $i ] = $temp;
>
> Ok?
> =dn
>
>
> > thx a lot for your answer,
> >
> > in fact i only have to return one of the 15 datas, so it makes one
column...
> > anyway, i already coded a solution with a while. My question was just to
> > know if it was possible to do it without repeating 1000000 times the
same
> > processing.
> >
> > In fact i begin to believe that it is not possible to reverse the 2
> > dimensions of an array...
> >
> > If you have a solution for me i m interested, even if it takes a lot of
> > processor ressources because i will have a dedicated server and there
wont
> > be more than 30 users, not at the same time (that s for a stat
intranet)...
> > just to correct my unprecision again, there will be 1M datas to process
not
> > 15 because the array i ve to process is the result of my mysql query and
> > that this query will only return a single column of datas (count(*) )
> >
> > Helllpppp :)
> >
> > Etienne
> >
> >
> > ----- Original Message -----
> > From: "DL Neil" <[EMAIL PROTECTED]>
> > To: "Etienne Durand" <[EMAIL PROTECTED]>
> > Cc: <[EMAIL PROTECTED]>
> > Sent: Thursday, January 31, 2002 10:44 AM
> > Subject: Re: [PHP-DB] how to reverse a hudge multidimensional array?
> >
> >
> > > Etienne,
> > >
> > > > Well i hope someone will be able to give me a solution...
> > > > Here s my problem:
> > > > I'm working with a hudge mysql table (about 15 columns and 1000000
> > rows...)
> > > >
> > > >  in fact i ve got to count the number of couples
`ncompte`/`naffaire` in
> > the
> > > > table and finaly calculate the number of couples that appear once,
> > twice....
> > > >
> > > > here is the query i do:
> > > > $result = mysql_query("SELECT count(*) FROM datas GROUP BY
`ncompte`,
> > > > `naffaire`");
> > > >
> > > > its result like something like this:
> > > >       count(*)  naffaire  ncompte
> > > >       4 affaire1 compte1
> > > >       4 affaire2 compte2
> > > >       1 affaire3 compte3
> > > >       2 affaire4 compte4
> > > >       1 affaire5 compte5
> > > >
> > > > (plus many more)
> > > >
> > > >
> > > > my final result should be:
> > > > $result[1]   :    2
> > > > $result[2]   :    1
> > > > $result[4]   :    2
> > > >
> > > > I manage to do this quite easily but i use a while instruction...
> > > >
> > > > while($row = mysql_fetch_array($result)) {
> > > > array_push($suite, $row["count(*)"]);
> > > > }
> > > >
> > > > As my table is very long the while takes a lot of time to
complete...
> > > > So my question is : Is there a solution to return my array as follow
:
> > > >
> > > > 1  2  3                     1  4  7
> > > > 4  5  6      ===>>    2  5  8              ???
> > > > 7  8  9                     3  6  9
> > > >
> > > > It would allow me to not have to use this long long while....
> > > > So if someone could telle me how to modify my query or what
instructions
> > to
> > > > use to do that...
> > >
> > >
> > > =there are various functions in PHP to 'reverse' arrays, but I must
> > confess that I have never used them.
> > > Regardless, if there is one to suit your purpose, it will surely
consume
> > CPU time to achieve the swap-over of
> > > 15M items.
> > >
> > > =your example "my final result should be:" talks of enumerated arrays,
so
> > I shall assume this is the way you
> > > always use them.
> > >
> > > =you want to somehow achieve:
> > > array[1][1] = array [1][1];
> > > array[1][2] = array [2][1];
> > > array[1][3] = array [3][1];
> > > etc
> > > (you know that you can't do the above, right!?)
> > >
> > > =thereafter the array would be processed by using a mechanism such as
two
> > nested FOR loops to iterate through
> > > the row/column elements of the array, eg
> > >
> > > for ( i=1; i<15; i++ );
> > >   for ( j=1; j<1000000; j++ );
> > >     process( array[i][j] );
> > >     etc
> > >
> > > =can you leave the array where it is, and adjust the way the
iterations
> > are managed? Instead of proceeding
> > > methodically by counting 'up', count 'down', eg
> > >
> > > for ( i=15; i>0; i-- );
> > >   for ( j=1000000; j>0; j-- );
> > >     process( array[i][j] );
> > >     etc
> > >
> > > =Regards,
> > > =dn
> > >
> > >
> > >
> >
> >
> >
> > --
> > PHP Database Mailing List (http://www.php.net/)
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > To contact the list administrators, e-mail: [EMAIL PROTECTED]
> >
> >
>



-- 
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to