The array it is fetching has size 2 , so if we comment out $size it returns 2 , but the for loop prints only the value present at 0th position of table column and not the next at 2th giving the error:
Undefined offset: 1
Code:
$allunstitched="Select p_id from unstitchedproduct";
$resultAllUnstitched= mysqli_query($connection,$allunstitched);
$AllUnstitchedResult= mysqli_fetch_array($resultAllUnstitched);
//$size=count($AllUnstitchedResult);
for ($i=0, $count = count($AllUnstitchedResult); $i < $count; ++$i) {
print $AllUnstitchedResult[$i];
}
You're using mysqli_fetch_array. This function returns the result twice by default: indexed both by number and by column name. Here the result set has only one column, so you get its value twice in the array: first with index 0 and then with a string index. There is no index 1.
To get the results with numerical indexes only, pass MYSQLI_NUM as a second argument to mysqli_fetch_array:
mysqli_fetch_array($resultAllUnstitched, MYSQLI_NUM);
Um, i dont think you have a problem in your for-loop; since your query reads ONE field/column it should have 1 iteration (=0 index), so the =1 undefined is correct (in my opinion).
What you should do is a loop that calls repeatedly mysqli_fetch_array to get all rows, like this:
while($AllUnstitchedResult = mysqli_fetch_array($resultAllUnstitched,MYSQLI_NUM)) {
foreach ($AllUnstitchedResult as $field) {
print $field;
}
}
If you start at 0, if count = 5 you'll have 6 elements (0,1,2,3,4,5), beware of that. You need to loop (count-1) times:
$count = count($AllUnstitchedResult);
for ($i=0, $i < $count-1; $i++) {
print $AllUnstitchedResult[$i];
}
Related
I got an array working like this:
$listaMaterias[x]['id_materia'] = (value with number and letters random)
$listaMaterias[x]['name_materia'] = (string)
$listaEditoriales[x]['id_editorial'] = (value with n. and l. random)
$listaEditoriales[x]['name_editorial'] = (string)
A 'materia' is a book's category. I made a foreach where I get all values from an xml right. Many editorials and materias, where some of them comes repeated.
And then, I make a method with an array_intersect to make remove repeated values, but I get an error :
$listaEdits_result = array(); // final results
$listaMats_result = array();
$listaEds_first_res = $listaEditoriales[0];
for ($j = 1 ; $j < count($listaEditoriales) ; $j++ ){
$listaEdits_result = array_intersect($listaEds_first_res, $listaEditoriales[$j]);
$listaEds_first_res = $listaEdits_result;
}
$listaMts_first_res = $listaMaterias[0];
for ($k = 1 ; $k < count($listaMaterias) ; $k++ ){
// Line 285, is this one above
$listaMats_result = array_intersect($listaMts_first_res, $listaMaterias[$j]);
$listaMts_first_res = $listaMats_result;
}
And finally, I get this error :
Notice: Undefined offset: 20 in [URL]/menu-librosnormales.php on line 285
Warning: array_intersect(): Argument #2 is not an array in [URL]/menu-librosnormales.php on line 285
Why access offset 20 if before I count this quantity in every array :
count($listaEditoriales) : 20
count($listaMaterias) : 14
Instead of $listaMaterias[$j] do $listaMaterias[$k] in second loop below line:-
$listaMats_result = array_intersect($listaMts_first_res, $listaMaterias[$j]);
Note:- If your aim is to remove duplicates from an array then you can use array_unique() easily.
In the second loop you use $listaMaterias[$j] but the loop is indexed by $k, not by $j.
The value of $j is count($listaEditoriales) because this was the last value of $j when the first loop ended. Since $listMaterias contains only 14 items, trying to access its 21st item triggers the notice you described.
If the purpose of each loop is to compute the intersection of the arrays stored in $listaEditoriales (and $listaMaterias) then you can do with a single call to array_intersect() using arguments unpacking (the so-called "splat operator"):
$listaEds_first_res = array_intersect(...$listaEditoriales);
$listaMts_first_res = array_intersect(...$listaMaterias);
The arguments unpacking operator is available since PHP 5.6. If you need to run the code on older PHP versions then you can use call_user_func_array() instead:
$listaEds_first_res = call_user_func_array('array_intersect', $listaEditoriales);
$listaMts_first_res = call_user_func_array('array_intersect', $listaMaterias);
The two lines of code above do the same thing as the entire block of code you posted in the question (faster and without errors).
$players = array(
array('Lionel Messi', 'Luis Suarez', 'Neymar Jr'),
array('Ivan Rakitic', 'Andres Iniesta', 'Sergio Busquets'),
array('Gerrard Pique', 'Mascherano', 'Denis Suarez', 'Jordi Alba'),
array('MATS'),
array('Arda Turan', 'Munir El Hadadi', 'Umtiti')
);
Now i am trying to echo the number of all the elements within the boundary of this array $players. For example, there are 3 elements in the first, 3 in the second. There are 4 elements in the third, 1 element in the 4th and 3 elements in the last one. Altogether these elements are 14 elements. Now i want to display 'Total Players: 14'. I can show the number of categories (5) using count() function but can't count the total elements(14). I tried different approaches but couldn't succeed.
count() should be able to do this for you directly, using the COUNT_RECURSIVE flag:
$playerCount = count($players, COUNT_RECURSIVE) - count($players);
// $playerCount is now equal to 14
The subtraction of the normal count is because counting recursively adds the keys of the outer array in to the sum of elements, which just needs to be subtracted from the recursive count.
The native count() method can do that.
$count = count($players, COUNT_RECURSIVE) - count($players);
Because the recursive count will also count the number of $player groups you have, you have to subtract that number from the recursive count.
From the php documentation for count:
If the optional mode parameter is set to COUNT_RECURSIVE (or 1), count() will recursively count the array. This is particularly useful for counting all the elements of a multidimensional array.
One other way, pretty self-explanatory:
$count = array_sum(array_map('count', $players));
$count=0;
foreach($players as $row) $count+=count($row);
$count is now 14.
Live demo
You can use:
count($array, COUNT_RECURSIVE);
check count manual
Declare a variable initialised to 0 to accumulate the number of elements. Then, iterate the first array (which contains the other arrays), and for each element (which is also an array) use count() to obtain the number of elements and add that value to the accumulator variable.
$num_players = 0;
foreach($players as $row) {
$num_players += count($row);
}
i'm trying to exctract array with this code, but it gives that error. But if i remove while block from code and only give indice it works. Here is the code.
//This function gives error: Notice: Undefined offset: 1 in .......
//but if i delete while block and only write print $type[$i]; it works.
public function checkMimeType(){
echo '<pre>';
$i = 0;
$type = array();
foreach($this->_sourceFile as $key){
$type= $key['type'];
}
while($i <= count($type))
{
print $type[$i].'<br>';
$i++;
}
}
YOu're looping one time to often ;)
Index numbers start at zero. If there's one element in your array, the only index that is defined is therefore 0. count() will return 1.
If you loop 'till $i<= 1, it will stop at $i = 1. There is no element with the ID of 1.
So, instead, use while($i < count($type))
The count is not equal to the last index.
An array [x, y, z] has a count of 3, but the last index is 2.
So, in your while loop, you are not allowed to run until <= count, but only < count. When $ibecomes count the index is out of bounds already.
In your first loop you are not adding values to an array, you are overwriting the $type variable each time. Try this:
$type[] = $key['type'];
Edit: And also what #thst said
I'm trying to run a PHP script that finds all the numbers divisible by 3 or 5, dumps them into an array, and adds all the values together. However, When I try to run it, I get a number output (I don't know if it's correct or not) and several hundred errors. They start out with:
Notice: Undefined offset: 1 in G:\Computer Stuff\WampServer\wamp\www\findthreesandfives.php on line 18
Then the offset number increases by increments of 1-3 (randomly, I haven't seen a pattern yet). I can't figure out what's wrong. Here's my code:
<?php
function loop($x)
{
$a = array(); //array of values divisible by 3 or 5
$l = 0; //length of the array
$e = 0; //sum of all the values in the array
for ($i=0; $i<=$x; $i++){ //this for loop creates the array
$n3=$i%3;
$n5=$i%5;
if($n3 === 0 || $n5 === 0){
$a[$i]=$i;
$l++;
}
}
for ($v=0; $v<=$l; $v++){ //this loop adds each value of the array to the total value
$e=$e + $a[$v];
}
return $e;
}
echo loop(1000);
?>
Someone please help...
The problem in your code is the following line:
$a[$i]=$i;
Should be:
$a[count($a)] = $i;
This is because the value of $i is always increasing, so using $i as your pointer will create gaps in the array's indices. count($a) returns the total number of items in the given array, which also happens to be the next index.
EDIT: #pebbl suggested using $a[] = $i; as a simpler alternative providing the same functionality.
EDIT 2: Solving the subsequent problem the OP described in the comments:
The problem seems to be that $l is greater than the number of items in $a. Thus, using count($a) in the for loop should fix your subsequent error.
Try replacing:
for ($v=0; $v<=$l; $v++){
With:
for ($v=0; $v<=count($a); $v++){
I found the same problem as #zsnow said. There are gaps within $a. The if condition allowed the gaps making the assignment skip some indexes. You can also use this
foreach ($a as $v){ //this loop adds each value of the array to the total value
$e=$e + $a[$v];
}
should actually be
foreach ($a as $v){ //this loop adds each value of the array to the total value
$e=$e + $v;
}
Lets say i have an array in PHP
$test['michael_unique_id'] = 3;
$test['john_unique_id'] = 8;
$test['mary_unique_id'] = 10;
.
.
.
.
$test['jimmy_unique_id'] = 4;
(the values (3,8,10.........4) are unique)
Lets say i want to search for the unique id 10, and get the order of the matching element in the array. In this example, the third element has the value 10, so i should get the number 3.
I can do it by scanning with a for loop looking for the value i'm searching and then get the $i value when i have a match, but i wonder if there is any built-in function (or a better method) that implements this.
You can get all of the array's values as an array with array_values() and then use array_search() to get the position (offset) of that value in the array.
$uniq_id = 10;
$all_vals = array_values($test); // => array(3, 8, 10, ... )
echo array_search( $uniq_id, $all_vals ); // => 2
Because PHP array indices are zero-based, you'll get 0 for the first item, 1 for the second item, etc. If you want the first item to be "1," then just add one. All together now:
$uniq_id = 10;
echo array_search( $uniq_id, array_values( $test ) ) + 1; // => 3
It's not clear to me, however, that this is necessarily as performant as just doing a foreach:
$uniq_id = 10;
$idx = 1;
foreach($test as $val) {
if($val == $uniq_id) {
break;
}
$idx++;
}
echo $idx; // => 3
Well, array_search will give you the key, but in your case, you want the index of that key, so I believe a loop is your best bet. Is there a good reason why you need the index? It doesn't seem very useful to me.