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

Тема в разделе "PHP", создана пользователем LEXAlForpostl, 24 ноя 2011.

Модераторы: latteo
  1. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Здравствуйте.
    Написал простейшую функцию удаления элементов, значение которых равно единице.
    PHP:
    function ($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).
    Мистика какая-то.
    Буду благодарен за помощь.
     
  2. Delk0

    Delk0

    Регистр.:
    26 мар 2010
    Сообщения:
    284
    Симпатии:
    47
    Как минимум не стоит пересчитывать количество элементов массива каждую итерацию цикла.
    Ну и во внутреннем цикле была ошибка, так должно работать:
    PHP:
    function ($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>";                
                    }
            }
        }
    }  
     
  3. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Забыл добавить, матрица квадратная ;)
    Но и Ваш вариант не работает.

    Вот часть данных, выведенных на экран
    Обратите внимание, единица на экране.
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Из ошибок сразу вижу $i<=count ($arr) , аналогичное во втором варианте. А нужно $i < count ($arr) строго меньше. Тк count возвращает количество элементов, а в обычном массиве нумерация начинается с 0. Те последний элемент это count -1

    Я смотрю у тебя цифры большой точности , там может и не быть единицы, попробуй выполнить код и
    var_dump(0.999999999999999==1, 0.999999999999999);
    Если же такого нет- дайт вхдной массив посмотреть
     
  5. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    А почему бы не использовать вместо for(), foreach()? не нужно будет лишний запрос на размер массива выполнять...
     
  6. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    Я привел пример входных данных.
    Там реальная единица. Вардамп пишет float(1). Я не понимаю в чём трабл.
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Просто пхп округляет число, есть глюки при очень длинных цифрах.
    1) Попробуй сдлеать условие, те округлить до 14 цифры
    if ( round( $arr[$i][$j], 14 )==1.0)
    ...
    echo round( $arr[$i][$j], 14 )."<BR>";

    2) можно попробовать посмотреть что в массиве переведя его в текстовый вид с помощью serialize хотя не факт что и он выведет норм
     
  8. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    проблема в том, что ваш скрипт работает и отсеивает все единицы без лишних вопросов... А вот с отображением чисел с плавающей запятой, у которых после запятой более 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. LEXAlForpostl

    LEXAlForpostl

    Регистр.:
    21 май 2008
    Сообщения:
    708
    Симпатии:
    225
    РНР выдаёт большие числа в виде 9.54846315E-7(степень -7).
    Интересно, почему он только некоторые числа до 1 округляет.

    И чтобы новой темы не создавать, спрошу здесь.
    Что за символы я получаю в ответе: \u041f
    Как их сконвертировать в читабельную строку?
    Пробовал:
    выдаёт кракозяб
     
  10. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    по ходу это буква кирилицы в юникоде... погуглите \u041f найдете много ответов..
    почитайте здесь
    ну в общем это кирилическая буква П в стандарте юникода 6.0.0