С PHP на ROR. Часть первая

Начну небольшую серию статей как я PHP программист осваивали потихоньку переходил на Ruby on Rails. Тут я буду объяснять часто требовательные функционал на PHP и его аналог на Ruby on Rails. Ну что же, начнем!

Масивы (Arrays)

Существует много различных способов создания массива (array) в PHP. Что нам нужно знать, так это то, что объекты Array и Hash включают в себя разные функциональные особенности PHP массивов.

Сортировка Масивов

Только чисельно-индексный массив может быть отсортирован в Ruby. Создать такой массив можно несколькими путями. Самый популярный – использование квадратных скобок с разделителем в виде запятой. Также используется %w{} для создания массива из списка строк. Ruby не сохраняет индексацию массива, как это делает PHP массив. Ruby массивы – это простые стеки, где индекс определяется лишь позицией элемента. Не возможно пропустить элемент Ruby массива.
PHP

  1. array = array(‘chicago’, ‘london’, ‘paris’);
  2. var_export($array);
  3. // => array(0 => ‘chicago’, 1 => ‘london’, 2 => ‘paris’)

Ruby

  1. array = ["chicago", "london", "paris"]
  2. # or
  3. array = %w{ chicago london paris }
  4.  
  5. p array
  6. # => ["new york", "london", "paris"]

Ассоциативные массивы

Для создания ассоциативных массивов в Ruby используется хэш (hash). Наиболее распространенным синтаксисом для создания хэша в Ruby используются фигурные скобки с разделенных запятыми список ключевых пар. Запомните, что хеш не упорядочен. Если Вам нужно упорядочить ассоциативный массив, Вам потребуется создать массив объектов.
PHP

  1. $array = array(‘age’ => 26, ‘name’ => ‘Joe’, ‘country’ => ‘USA’);
  2. var_export($array);
  3. // => array(‘age’ => 26, ‘name’ => ‘Joe’, ‘country’ => ‘USA’)

Ruby

  1. p {:age => 26, :name => "Joe", :country => "USA"}
  2. # => {:age=>26, :country=>"USA", :name=>"Joe"}

Смешаные массивы

Можем создавать массивы с сочетание числовых и строковых ключей в Ruby с помощью хэшей (hash). PHP автоматически присваивает числовой индекс элементов без определенного ключа. Ruby отличается тем, что требует указать ключевое значение каждого элемента.
PHP

  1. $array = array(‘age’ => 25, 1, ‘name’ => ‘Joe’, 2);
  2. var_export($array);
  3. // => array(‘age’ => 25, 0 => 1, ‘name’ => ‘Joe’, 1 => 2)

Ruby

  1. hash = {:age => 25, 0 => 1, :name => "Joe", 1 => 2}
  2. p hash
  3. # => {0=>1, :age=>25, 1=>2, :name=>"Joe"}

is_array

Мы можем убедиться, что переменная массив используя объект # is_a?.
PHP

  1. $colors = array(‘red’, ‘green’, ‘blue’);
  2. $result = is_array($colors);
  3. var_export($result);
  4. // => true

Ruby

  1. colors = ["red", "green", "blue"]
  2. p colors.is_a?(Array)
  3. # => true

count

Мы можем подсчитать количество элементов в массиве Ruby используя Array #length метод.
PHP

  1. $numbers = array(1, 2, 3);
  2. print count($numbers);
  3. // => 3

Ruby

  1. numbers = [1, 2, 3]
  2. puts numbers.length
  3. # => 3

Важно помнить о том, что в то время как мы можем пропустить элементы массива в PHP, мы не можем это сделать в Ruby. Если добавить к десятому ключу элемент массива, Ruby будет заполнить недостающие элементы с нулевыми.
PHP

  1. $numbers = array(1, 2);
  2. $numbers[10] = 3;
  3. print count($numbers);
  4. // => 3

Ruby

  1. numbers = [1, 2]
  2. numbers[10] = 3
  3. puts numbers.length
  4. # => 11

list

Мы можем сделать эквивалентно PHP перечень элементов в Ruby с помощью параллельного назначения. В Ruby мы можем присвоить разделенных запятыми переменные элементов массива с помощью обычной запятой.
PHP

  1. $attributes = array(‘Joe’, 25, ‘blonde’);
  2. list($name, $age, $hair) = $attributes;
  3. print $name; // => ‘Joe’
  4. print $age;  // => 25
  5. print $hair; // => ‘blonde’

Ruby

  1. attributes = ["Joe", 25, "blonde"]
  2. name, age, hair = attributes
  3. puts name # => "Joe"
  4. puts age  # => 25
  5. puts hair # => "blonde"

range

Ruby может работать с диапазоном объектов чисел или строк.
PHP

  1. $sequence = range(0, 3);
  2. var_export($sequence);
  3. // => array(0 => 0, 1 => 1, 2 => 2, 3 => 3)
  4.  
  5. foreach ($sequence as $item) {
  6.     print "$item, ";
  7. }
  8. // => 0, 1, 2, 3,

Ruby

  1. sequence = 0..3
  2. p sequence
  3. # => 0..3
  4.  
  5. sequence.each {|item| print "#{item}, " }
  6. # => 0, 1, 2, 3,

Точно так же, как в PHP, мы можем создать iterable ряд последовательных строк.
PHP

  1. $alphas = range(‘a’, ‘d’);
  2. var_export($alphas);
  3. // => array(0 => ‘a’, 1 => ‘b’, 2 => ‘c’, 3 => ‘d’)
  4.  
  5. foreach ($alphas as $item) {
  6.     print "$item, ";
  7. }
  8. // => a, b, c, d,

Ruby

  1. alphas = ‘a’..‘d’
  2. p alphas
  3. # => "a".."d"
  4.  
  5. alphas.each {|item| print "#{item}, " }
  6. # => a, b, c, d,

in_array

Мы можем проверить элемент на существования в массиве с помощью функции Array#include?.
В PHP in_array имеет строгое аргументирование, который будет рассматривать какого типа объект. Ruby считает число 1 и строку ’1′ как же самое, и всегда будет действовать в эквивалент с PHP если присвоить strict = true для этой функции.
PHP

  1. $fruit = array(‘apple’, ‘banana’, ‘kiwi’);
  2. $result = in_array(‘apple’, $fruit, true);
  3. var_export($result);
  4. // => true

Ruby

  1. fruit = ["apple", "banana", "kiwi"]
  2. p fruit.include?("apple")
  3. # => true

Точно так же, как PHP, Ruby можете проверить наличие элемента в массиве, даже если этот элемент массива (или любой другой объект).
PHP

  1. $list = array(array(‘a’, ‘b’), ‘c’);
  2. $result = in_array(array(‘a’, ‘b’), $list);
  3. var_export($result);
  4. // => true

Ruby

  1. list = [["a", "b"], "c"]
  2. p list.include?(["a", "b"])
  3. # => true

Думаю на сегодня хватит. Удачи!

26. января 2009 by Alexey Vasiliev
Categories: PHP, Ruby on Rails | Tags: , | 10 комментариев

Comments (10)

  1. Встретил сайт, который решил все мои проблемы при переходе на ruby.
    Rails for PHP developers, вещь! Снимает основной блок.
    http://railsforphp.com/reference/

  2. Меня мучает только один вопрос: что заставило Вас, Алексей, выучить руби? Он о-очень редко используется в странах СНГ … любопытство, надобность или он на самом деле хорош?

  3. 2ignar
    Не популярный, не значит не прибыльный. Сейчас я на руби САМ создаю сайт от 2 до 5 дней в зависимости от сложности (с нуля, без всяких движков). Да и на руби можно писать оконные приложения.

    ЗЫ Специально для Вас поищу одно видео, увидите что он очень популярен, просто до стан СНГ поздно доходит.

  4. Ну я так понимаю, руби на рельсах только для небольших сайтецов.
    Правильно?
    А как на счёт джанги? Сравнение написать можешь, они вроде как конкуренты в своей области, или ты с ним не знаком?

  5. Небольшие сайтецы? Про Твитер слышал?
    Вот список – http://rubyonrails.org/applications
    Django – это ж Питоновский фреймворк, а я же на Руби пишу.
    Для руби знаю ещё Merb – http://merbivore.com/
    Ну сравнивать Руби и Питон, да ещё и фреймворки… языки ещё понятно, но фреймворки на одном языке проще сравнивать.

  6. Нет, не слышал. Поведай.
    Какой список? ))
    Ну обычно при выборе фреймворка у большинства разработчиков стоит выбор между Джанго и РОР. Каждый хвалит своё болото, хотелось бы посмотреть ОБЪЕКТИВНОЕ сравнение этих фреймворков.

    Почему же, с руби и питоном по-моему всё ясно, с фреймворками не особо. Ну мне по крайней мере.

  7. гы, пришло на почту со ссылкой, а тут не отображается.
    Первая ссылка, на тему РоР и твитер, вот к чему привела

    «твитер перестал тормозить благодаря собственной системе сообщений starling, а не «ферме побольше», по-поводу кластера вы тоже не правы, RoR в нынешнем состоянии не может нормально масштабироваться и потоко-небезопасен (это будет со следующей версии). »
    http://209.85.129.132/search?q=cache:_SHRTFjQt80J:forum.0day.kiev.ua/index.php%3Fact%3DPrint%26client%3Dwordr%26f%3D87%26t%3D82624+%D0%A2%D0%B2%D0%B8%D1%82%D0%B5%D1%80+ROR&hl=ru&ct=clnk&cd=1&gl=ua&client=firefox-a

    Да, не воспринимай всё так близко к сердцу, я ж просто интересуюсь, а не утверждаю, т.к. нечего мне утверждать по РоР. Я с ним не работал.

  8. гы, пришло на почту со ссылкой, а тут не отображается.
    Первая ссылка, на тему РоР и твитер, вот к чему привела

    «твитер перестал тормозить благодаря собственной системе сообщений starling, а не «ферме побольше», по-поводу кластера вы тоже не правы, RoR в нынешнем состоянии не может нормально масштабироваться и потоко-небезопасен (это будет со следующей версии). »
    http://209.85.129.132/search?q=cache:_SHRTFjQt80J:forum.0day.kiev.ua/index.php%3Fact%3DPrint%26client%3Dwordr%26f%3D87%26t%3D82624+%D0%A2%D0%B2%D0%B8%D1%82%D0%B5%D1%80+ROR&hl=ru&ct=clnk&cd=1&gl=ua&client=firefox-a

    Да, не воспринимай всё так близко к сердцу, я ж просто интересуюсь, а не утверждаю, т.к. нечего мне утверждать по РоР. Я с ним не работал.

  9. У меня ссылки с комментариев не отображаются…

  10. 2dont
    >>У меня ссылки с комментариев не отображаются…
    Это система против спама решила проверить, а вдруг ты спамиш, и оставила мне на одобрение коментарии

    Насчет РОР, я скоро доделаю один сайт и сразу увидишь что и как.