Новый (в 2014 году) tidyr
пакет также делает это просто, при этом gather()
/ spread()
является слагаемыми для melt
/ cast
.
library(tidyr)
spread(dat1, key = numbers, value = value)
Из github ,
tidyr
- это перерисовкаreshape2
, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку сmagrittr
иdplyr
, чтобы построить сплошной конвейер для анализа данных.Так же, как
blockquote>reshape2
сделал меньше, чем изменение,tidyr
делает меньше, чемreshape2
. Он разработан специально для сбора данных, а не для общей перестройки, которую делаетreshape2
, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, аtidyr
не содержит полей или агрегации.
Я просто придумал эту небольшую вспомогательную функцию:
function get(&$var, $default=null) {
return isset($var) ? $var : $default;
}
Это не только работает для словарей, но и для всех переменных:
$test = array('foo'=>'bar');
get($test['foo'],'nope'); // bar
get($test['baz'],'nope'); // nope
get($test['spam']['eggs'],'nope'); // nope
get($undefined,'nope'); // nope
Передача ранее неопределенная переменная для ссылки не вызывает ошибку NOTICE
. Вместо этого передача $var
по ссылке определит его и установит в null
. Значение по умолчанию также будет возвращено, если переданная переменная null
. Также обратите внимание на неявно сгенерированный массив в примере spam / eggs:
json_encode($test); // {"foo":"bar","baz":null,"spam":{"eggs":null}}
$undefined===null; // true (got defined by passing it to get)
isset($undefined) // false
get($undefined,'nope'); // nope
Обратите внимание, что хотя $var
передается по ссылке, результатом get($var)
будет копия $var
, не ссылка. Надеюсь, это поможет!
Время проходит, и PHP развивается. PHP7 теперь поддерживает Null-коалесцирующий оператор :
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
PHP 5.3 имеет сокращенную версию тернарного оператора:
$x = $foo ?: 'defaultvaluehere';
, который в основном
if (isset($foo)) {
$x = $foo;
else {
$x = 'defaultvaluehere';
}
В противном случае нет, более короткий метод отсутствует.
$x = isset($foo) ? isset($foo) : 'defaultvaluehere';
, а не $x = isset($foo) ? $foo : 'defaultvaluehere';
– NikiC
14 July 2011 в 17:16
NOTICE
, когда переменная не определена, в отличие от функции isset
.
– Chris B.
24 June 2013 в 01:30
«Немного» хакерский способ сделать это:
<?php
$foo = array();
var_dump('baz' == $tmp = &$foo['bar']);
$foo['bar'] = 'baz';
var_dump('baz' == $tmp = &$foo['bar']);
http://codepad.viper-7.com/flXHCH
Очевидно, это не очень хороший способ сделать это. Но это удобно в других ситуациях. Например. Я часто объявляю быстрые ссылки на переменные GET и POST:
<?php
$name =& $_GET['name'];
// instead of
$name = isset($_GET['name']) ? $_GET['name'] : null;
PS: Можно было бы назвать это «встроенным ==$_=&
специальным оператором сравнения»:
<?php
var_dump('baz' ==$_=& $foo['bar']);
PPS: Ну, вы могли бы просто использовать
<?php
var_dump('baz' == @$foo['bar']);
, но это еще хуже, чем оператор ==$_=&
. Знаете, людям не нравится оператор подавления ошибок.
Мне полезно создать такую функцию:
function array_value($array, $key, $default_value = null) {
return is_array($array) && array_key_exists($key, $array) ? $array[$key] : $default_value;
}
И использовать его следующим образом:
$params = array('code' => 7777, 'name' => "Cloud Strife");
$code = array_value($params, 'code');
$name = array_value($params, 'name');
$weapon = array_value($params, 'weapon', "Buster Sword");
$materia = array_value($params, 'materia');
echo "{ code: $code, name: $name, weapon: $weapon, materia: $materia }";
Значение по умолчанию в этом случае - null
, но вы можете настроить его на все, что вам нужно.
Надеюсь, это полезно.
использовать оператор управления ошибкой @ с быстрой версией PHP 5.3 для тернарного оператора
$bar = @$foo['bar'] ?: 'defaultvalue';
error_reporting(0)
при оценке $foo['bar']
. Он все равно будет вызывать обработчик ошибок, а обработчик ошибок должен игнорировать ошибку, если error_reporting() === 0
.
– Jesse
21 August 2015 в 12:28
Если вы перечисляете значения по умолчанию по ключу в массиве, это можно сделать следующим образом:
$foo = array('a' => 1, 'b' => 2);
$defaults = array('b' => 55, 'c' => 44);
$foo = array_merge($defaults, $foo);
print_r($foo);
Который приводит к:
Array
(
[b] => 2
[c] => 44
[a] => 1
)
Чем больше клавиш / пары значений, которые вы перечисляете по умолчанию, тем лучше становится код-гольф.
$ar[0][1][1]
, созданный с помощьюget($ar[0][1][1]), 'def');
? – CoR 26 November 2014 в 12:32!empty
вместоisset
, он проверяет, действительно ли переменная имеет значение. – EliuX 15 April 2016 в 16:50get($test['foo']['bar']);
– Slavik Meltser 22 March 2017 в 12:30