Вы можете использовать функцию array_map с нулем в качестве обратного вызова.
$arr = array_map(
null,
$arr[0],
$arr[1],
$arr[2]
);
print_r($arr);
//Output
Array
(
[0] => Array
(
[0] => one
[1] => sun
[2] => jan
)
[1] => Array
(
[0] => two
[1] => mon
[2] => feb
)
[2] => Array
(
[0] => three
[1] => tues
[2] => march
)
)
Его довольно легкое, чтобы сделать это, на самом деле. Несколько классов должны получить Вас движение. Причем первое Event
класс, следующим образом:
class com.rokkan.events.Event
{
public static var ACTIVATE:String = "activate";
public static var ADDED:String = "added";
public static var CANCEL:String = "cancel";
public static var CHANGE:String = "change";
public static var CLOSE:String = "close";
public static var COMPLETE:String = "complete";
public static var INIT:String = "init";
// And any other string constants you'd like to use...
public var target;
public var type:String;
function Event( $target, $type:String )
{
target = $target;
type = $type;
}
public function toString():String
{
return "[Event target=" + target + " type=" + type + "]";
}
}
Затем я использую два других базовых класса. Один для регулярных объектов и на для объектов, которые должны расшириться MovieClip
. Сначала нет MovieClip
версия...
import com.rokkan.events.Event;
import mx.events.EventDispatcher;
class com.rokkan.events.Dispatcher
{
function Dispatcher()
{
EventDispatcher.initialize( this );
}
private function dispatchEvent( $event:Event ):Void { }
public function addEventListener( $eventType:String, $handler:Function ):Void { }
public function removeEventListener( $eventType:String, $handler:Function ):Void { }
}
Затем MovieClip
версия...
import com.rokkan.events.Event;
import mx.events.EventDispatcher;
class com.rokkan.events.DispatcherMC extends MovieClip
{
function DispatcherMC()
{
EventDispatcher.initialize( this );
}
private function dispatchEvent( $event:Event ):Void { }
public function addEventListener( $eventType:String, $handler:Function ):Void { }
public function removeEventListener( $eventType:String, $handler:Function ):Void { }
}
Просто расширьте свои объекты или с помощью Диспетчера или с помощью DispatcherMC, и Вы сможете диспетчеризировать события и прислушаться к событиям так же к AS3. Существует всего несколько причуд. Например, когда Вы звоните dispatchEvent()
необходимо передать в ссылке на объект, диспетчеризирующий событие, обычно только путем обращения к объекту this
свойство.
import com.rokkan.events.Dispatcher;
import com.rokkan.events.Event;
class ExampleDispatcher extends Dispatcher
{
function ExampleDispatcher()
{
}
// Call this function somewhere other than within the constructor.
private function notifyInit():void
{
dispatchEvent( new Event( this, Event.INIT ) );
}
}
Другая причуда - когда Вы хотите прислушаться к тому событию. В AS2 необходимо использовать Delegate.create()
получить корректный объем функции обработки событий. Например:
import com.rokkan.events.Event;
import mx.utils.Delegate;
class ExampleListener
{
private var dispatcher:ExampleDispatcher;
function ExampleDispatcher()
{
dispatcher = new ExampleDispatcher();
dispatcher.addEventListener( Event.INIT, Delegate.create( this, onInit );
}
private function onInit( event:Event ):void
{
// Do stuff!
}
}
Надо надеяться, я скопировал и вставил все это правильно из моих старых файлов! Надежда это удается для Вас.
Я предположил бы, что лучшая практика должна будет использовать класс EventDispatcher, где когда-либо возможно. Можно читать об этом здесь: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00002325.html
Компоненты UI также имеют очень подобную AS3 диспетчеризацию события.
Я написал несколько классов для работы с событиями в AS2. Вы можете скачать их здесь.