<rmcreative>

RSS

Все заметки с тегами «php, array»

Можно уточнить:

  1. Разыменование массивов в trunk PHP

    1 августа 2010

    Ещё одна приятная новость. В транк PHP 5.4 (который, возможно, будет в итоге выпущен как PHP 6) попала очень полезная возможность — разыменование массивов:

    function test() {
        return array("one" => "PHP", "two" => "trunk", "three" => "is very cool");
    }
    echo test()["two"]; // !!!

    То есть теперь можно обращаться к индексу массива, возвращаемого из метода.

    17 комментариев
  2. PHP, валидация и массивы

    2 ноября 2009

    Наверное, многие сталкивались с задачей ввода произвольного числа одноимённых полей через форму. В PHP это сделано довольно удобно: в форме к имени поля добавляется [] и на стороне сервера в $_POST, $_GET или $_REQUEST мы получаем уже массив.

    В любом коде необходимо проверять данные, пришедшие из форм и адресной строки. В любом хорошем коде они проверяются. Но вот про эту особенность с квадратными скобками очень часто забывают.

    http://example.com/list.php?q=test
    http://example.com/list.php?q[]=test

    Довольно безобидный код, в котором нет проверки:

    $q = null;
    if(!empty($_GET['q'])) {
      $q = $_GET['q'];
    }
    // тут начинаем работать с $q как со строкой

    А вот менее безобидный пример: в WordPress до версии 2.8.4 можно было таким вот образом сгенерировать новый пароль администратора без отсылки ему каких-либо писем.

    3 комментария
  3. Итерация по массиву, значения по ссылке

    23 сентября 2008

    Иногда удобно воспользоваться возможностью PHP5 и использовать передачу по ссылке при переборе элементов массива. Например, для обрезания лишних пробелов у всех элементов:

    $arr = array('A', 'B', 'C');
    foreach ($arr as &$val) {
      $val = trim($val);
    }

    //что есть array_walk я знаю

    Всё это очень хорошо, но один раз мне пришлось из-за такой возможности очень несладко. Простейший, код, чтобы показать эффект:

    $arr = array('A', 'B', 'C');
    foreach ($arr as &$val) {}
    foreach ($arr as $val) {}
    var_dump($arr);
    array
      0 => string 'A' (length=1)
      1 => string 'B' (length=1)
      2 => &string 'B' (length=1)
    
    

    Тогда я вместо var_dump использовал print_r и не увидел &… На самом деле объяснение логичное: после первого цикла $val — ссылка на последний элемент массива. При второй итерации по этой ссылке начнут записываться значения, изменяя массив. Решается проблема так:

    $arr = array('A', 'B', 'C');
    foreach ($arr as &$val) {}
    unset($val);
    foreach ($arr as $val) {}
    var_dump($arr);
    6 комментариев
  4. Операции над массивами

    23 сентября 2008

    Многие забывают, что в PHP можно складывать массивы:

    $a = array (1, 2, 3);
    $b = array ('a' => 1, 2, 3);
    var_dump ($a + $b);
    array
      0 => int 1
      1 => int 2
      2 => int 3
      'a' => int 1
    
    

    Это не array_merge. Ключи при таком слитии массива сохраняются.

    Также можно сравнивать массивы. При этом == проверяет все пары ключ-значение и их количество, а === ещё и порядок.

    3 комментария
  5. PHP: последний элемент foreach. Альтернативнвый вариант.

    3 апреля 2008

    Один вариант уже был (для сравнения его тоже приведу), теперь ещё один:

    foreach ($array as $key => $value) {
      if($key == end($array)) {
            // делаем что-либо с последним элементом...
      }
      else {
            // делаем что-либо с каждым элементом
      }
    }

    Вариант Kost

    foreach ($array as $key => $value) {
       if (!next($array)) {
            // делаем что-либо с последним элементом...
       }
       else {
           // делаем что-либо с каждым элементом
       }
    }

    edit1:

    Спасибо dkrnl. Устроил тест.

    Вариант №1 работает только если явно задать ключи:

    $array = array('1' => '1','2' => '2','3' => '3', '4'=>'4','5'=>'5');

    Вариант №2 работает только если массив передать по ссылке:

    $array = new ArrayObject(array(1,2,3,4,5));
    

    Работающий в любом случае вариант:

    $total = count($array);
    $counter = 0;
    foreach($array as $key => value){
      $counter++;
      if($counter == $total){
        // делаем что-либо с последним элементом...
      }
      else{
        // делаем что-либо с каждым элементом
      }
    }

    edit2:

    А ведь и правда стало смахивать на for :) Неудобство в том, что при обращении к элементу в случае с for придётся использовать индекс.

    edit3:

    Неплохое решение DeadLy:

    $end_element = array_pop($array);
    foreach ($array as $value) {
       // делаем что-либо с каждым элементом
    }
       // делаем что-либо с последним элементом $end_element
    32 комментария
  6. PHP: последний элемент foreach

    7 сентября 2007

    Всё гениальное просто:

    foreach ($array as $key => $value) {
       // делаем что-либо с каждым элементом
       if (!next($array)) {
            // делаем что-либо с последним элементом...
        }
    }

    Спасибо говорим Kost-у.

    Комментировать