Не понятки в РНР

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
Написал простейшую функцию удаления элементов, значение которых равно единице.
PHP:
function f ($arr)
{
    for ($i = 0;$i<=count ($arr);$i++)
    {
        for ($j = 0;$j<=count ($arr);$j++)
        {
            
            if ($arr[$i][$j]==1.0)
                {
                    unset ($arr[$i][$j]);
                    
                }
            else
                {
                    echo $arr[$i][$j]."<BR>";                
                }
        }
    }
}
В ходе работы на экране отображаются единицы и при этом НЕКОТОРЫЕ удаляются, а некоторые нет. При вар_дампе пишут, что key => float (1).
Мистика какая-то.
Буду благодарен за помощь.
 
Как минимум не стоит пересчитывать количество элементов массива каждую итерацию цикла.
Ну и во внутреннем цикле была ошибка, так должно работать:
PHP:
function f ($arr)
{
    for ($i = 0, $c1=count($arr); $i<=$c1; $i++)
    {
        for ($j = 0, $c2=count($arr[$i]); $j<=$c2; $j++)
        {
            
            if ($arr[$i][$j]==1)
                {
                    unset($arr[$i][$j]);
                    
                }
            else
                {
                    echo $arr[$i][$j]."<BR>";                
                }
        }
    }
}
 
Забыл добавить, матрица квадратная ;)
Но и Ваш вариант не работает.

Вот часть данных, выведенных на экран
<BR>0.21996679257031<BR>1<BR>0.20754931234457<BR
Обратите внимание, единица на экране.
 
Из ошибок сразу вижу $i<=count ($arr) , аналогичное во втором варианте. А нужно $i < count ($arr) строго меньше. Тк count возвращает количество элементов, а в обычном массиве нумерация начинается с 0. Те последний элемент это count -1

Я смотрю у тебя цифры большой точности , там может и не быть единицы, попробуй выполнить код и
var_dump(0.999999999999999==1, 0.999999999999999);
Если же такого нет- дайт вхдной массив посмотреть
 
А почему бы не использовать вместо for(), foreach()? не нужно будет лишний запрос на размер массива выполнять...
 
Я привел пример входных данных.
Там реальная единица. Вардамп пишет float(1). Я не понимаю в чём трабл.
 
Я привел пример входных данных.
Там реальная единица. Вардамп пишет float(1). Я не понимаю в чём трабл.
Просто пхп округляет число, есть глюки при очень длинных цифрах.
1) Попробуй сдлеать условие, те округлить до 14 цифры
if ( round( $arr[$i][$j], 14 )==1.0)
...
echo round( $arr[$i][$j], 14 )."<BR>";

2) можно попробовать посмотреть что в массиве переведя его в текстовый вид с помощью serialize хотя не факт что и он выведет норм
 
проблема в том, что ваш скрипт работает и отсеивает все единицы без лишних вопросов... А вот с отображением чисел с плавающей запятой, у которых после запятой более 12 знаков возникают проблемы... пхп их просто округляет... в вашем случае до 1 :(
поэкспериментируйте, напишите скрипт:
PHP:
<?php 
$r=0.999999999999999;
echo $r;
?>
результатом будет 1
если $r=0.999999999999; то и результат будет таким же = 0.999999999999
попробуйте перед выводом на экран отформатировать число:
PHP:
<?php 
$r=0.999999999999999;
$t=number_format($r,17);
echo $t;
?>
в результате получите: 0.99999999999999900 главное чтоб число знаков после запятой было больше чем у форматируемого числа, иначе опять округлит и выдаст чето типа 1.000000000000
 
РНР выдаёт большие числа в виде 9.54846315E-7(степень -7).
Интересно, почему он только некоторые числа до 1 округляет.

И чтобы новой темы не создавать, спрошу здесь.
Что за символы я получаю в ответе: \u041f
Как их сконвертировать в читабельную строку?
Пробовал:
iconv("UTF-16BE","UTF-8","\u041f")
выдаёт кракозяб
 
по ходу это буква кирилицы в юникоде... погуглите \u041f найдете много ответов..
почитайте
ну в общем это кирилическая буква П в стандарте юникода 6.0.0
 
Назад
Сверху