Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F114180501
utils.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, May 24, 01:39
Size
5 KB
Mime Type
text/x-php
Expires
Mon, May 26, 01:39 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
26366494
Attached To
rPHU libphutil
utils.php
View Options
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
function
id
(
$x
)
{
return
$x
;
}
function
idx
(
array
$array
,
$key
,
$default
=
null
)
{
return
array_key_exists
(
$key
,
$array
)
?
$array
[
$key
]
:
$default
;
}
function
mpull
(
array
$list
,
$method
,
$key_method
=
null
)
{
$result
=
array
();
foreach
(
$list
as
$key
=>
$object
)
{
if
(
$key_method
!==
null
)
{
$key
=
$object
->
$key_method
();
}
if
(
$method
!==
null
)
{
$value
=
$object
->
$method
();
}
else
{
$value
=
$object
;
}
$result
[
$key
]
=
$value
;
}
return
$result
;
}
function
ipull
(
array
$list
,
$index
,
$key_index
=
null
)
{
$result
=
array
();
foreach
(
$list
as
$key
=>
$array
)
{
if
(
$key_index
!==
null
)
{
$key
=
$array
[
$key_index
];
}
if
(
$index
!==
null
)
{
$value
=
$array
[
$index
];
}
else
{
$value
=
$array
;
}
$result
[
$key
]
=
$value
;
}
return
$result
;
}
function
mgroup
(
array
$list
,
$by
/*, ... */
)
{
$map
=
mpull
(
$list
,
$by
);
$groups
=
array
();
foreach
(
$map
as
$group
)
{
// Can't array_fill_keys() here because 'false' gets encoded wrong.
$groups
[
$group
]
=
array
();
}
foreach
(
$map
as
$key
=>
$group
)
{
$groups
[
$group
][
$key
]
=
$list
[
$key
];
}
$args
=
func_get_args
();
$args
=
array_slice
(
$args
,
2
);
if
(
$args
)
{
array_unshift
(
$args
,
null
);
foreach
(
$groups
as
$group_key
=>
$grouped
)
{
$args
[
0
]
=
$grouped
;
$groups
[
$group_key
]
=
call_user_func_array
(
'mgroup'
,
$args
);
}
}
return
$groups
;
}
/**
* Sort a list of objects by the return value of some method.
*/
function
msort
(
array
$list
,
$method
)
{
$surrogate
=
mpull
(
$list
,
$method
);
asort
(
$surrogate
);
$result
=
array
();
foreach
(
$surrogate
as
$key
=>
$value
)
{
$result
[
$key
]
=
$list
[
$key
];
}
return
$result
;
}
/**
* Selects a list of keys from an array, returning a new array with only the
* key-value pairs identified by the selected keys, in the specified order.
*
* Note that since this function orders keys in the result according to the
* order they appear in the list of keys, there are effectively two common
* uses: either reducing a large dictionary to a smaller one, or changing the
* key order on an existing dictionary.
*
* @param dict Dictionary of key-value pairs to select from.
* @param list List of keys to select.
* @return dict Dictionary of only those key-value pairs where the key was
* present in the list of keys to select. Ordering is
* determined by the list order.
*/
function
array_select_keys
(
array
$dict
,
array
$keys
)
{
$result
=
array
();
foreach
(
$keys
as
$key
)
{
if
(
array_key_exists
(
$key
,
$dict
))
{
$result
[
$key
]
=
$dict
[
$key
];
}
}
return
$result
;
}
/**
* Returns the first argument which is not strictly null, or `null' if there
* are no such arguments. Identical to the MySQL function of the same name.
*
* @param ... Zero or more arguments of any type.
* @return mixed First non-null arg, or null if no such arg exists.
*/
function
coalesce
(
/* ... */
)
{
$args
=
func_get_args
();
foreach
(
$args
as
$arg
)
{
if
(
$arg
!==
null
)
{
return
$arg
;
}
}
return
null
;
}
/**
* Similar to coalesce(), but less strict: returns the first non-empty()
* argument, instead of the first argument that is strictly nonnull. If no
* argument is nonempty, it returns the last argument. This is useful
* idiomatically for setting defaults:
*
* $value = nonempty($get_value, 0);
*
* @param ... Zero or more arguments of any type.
* @return mixed First non-empty() arg, or last arg if no such arg
* exists, or null if you pased in zero args.
*/
function
nonempty
(
/* ... */
)
{
$args
=
func_get_args
();
foreach
(
$args
as
$arg
)
{
if
(
$arg
)
{
break
;
}
}
return
$arg
;
}
/**
* Invokes the "new" operator with a vector of arguments. There is no way to
* call_user_func_array() on a class constructor, so you can instead use this
* function:
*
* $obj = newv($class_name, $argv);
*
* That is, these two statements are equivalent:
*
* $pancake = new Pancake('Blueberry', 'Maple Syrup', true);
* $pancake = newv('Pancake', array('Blueberry', 'Maple Syrup', true));
*
* DO NOT solve this problem in other, more creative ways! Two popular
* alternatives are:
*
* - Build a fake serialized object and unserialize it.
* - Invoke the constructor twice.
*
* These are really bad solutions to the problem because they can have side
* effects (e.g., __wakeup()) and give you an object in an otherwise impossible
* state! Please endeavor to keep your objects in possible states.
*
* If you own the classes you're doing this for, you should consider whether
* or not restructuring your code (for instance, by creating static
* construction methods) might make it cleaner before using newv(). Static
* construtors can be invoked with call_user_func_array(), and may give your
* class a cleaner and more descriptive API.
*
* @param string The name of a class.
* @param list Array of arguments to pass to its constructor.
*
* @return obj A new object of the specified class, constructed by passing
* the argument vector to its constructor.
*/
function
newv
(
$class_name
,
array
$argv
)
{
$reflector
=
new
ReflectionClass
(
$class_name
);
return
$reflector
->
newInstanceArgs
(
$argv
);
}
Event Timeline
Log In to Comment