Как сортировать таблицу SQL, как только она отображается на HTML [duplicate]

Новый (в 2014 году) tidyr пакет также делает это просто, при этом gather() / spread() является слагаемыми для melt / cast.

library(tidyr)
spread(dat1, key = numbers, value = value)

Из github ,

tidyr - это перерисовка reshape2, предназначенная для сопровождения аккуратной структуры данных и работающая рука об руку с magrittr и dplyr, чтобы построить сплошной конвейер для анализа данных.

Так же, как reshape2 сделал меньше, чем изменение, tidyr делает меньше, чем reshape2. Он разработан специально для сбора данных, а не для общей перестройки, которую делает reshape2, или общего преобразования, которое изменилось. В частности, встроенные методы работают только для кадров данных, а tidyr не содержит полей или агрегации.

blockquote>

38
задан Yauhen Yakimovich 14 July 2011 в 17:09
поделиться

7 ответов

Я просто придумал эту небольшую вспомогательную функцию:

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, не ссылка. Надеюсь, это поможет!

39
ответ дан stepmuel 22 August 2018 в 15:35
поделиться
  • 1
    Круто. Интересно, почему это все еще не в PHP? :) – Yauhen Yakimovich 8 August 2014 в 15:01
  • 2
    Есть ли способ удалить / удалить $ar[0][1][1], созданный с помощью get($ar[0][1][1]), 'def');? – CoR 26 November 2014 в 12:32
  • 3
    Я написал сообщение в блоге для дальнейшего изучения проблемы и объяснения моего решения. – stepmuel 14 January 2016 в 21:44
  • 4
    Лучше использовать !empty вместо isset, он проверяет, действительно ли переменная имеет значение. – EliuX 15 April 2016 в 16:50
  • 5
    Он выдает предупреждение, когда вы используете его следующим образом: get($test['foo']['bar']); – Slavik Meltser 22 March 2017 в 12:30

Время проходит, и 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';
26
ответ дан Ivan Yarych 22 August 2018 в 15:35
поделиться

PHP 5.3 имеет сокращенную версию тернарного оператора:

$x = $foo ?: 'defaultvaluehere';

, который в основном

if (isset($foo)) {
   $x = $foo;
else {
   $x = 'defaultvaluehere';
}

В противном случае нет, более короткий метод отсутствует.

6
ответ дан Marc B 22 August 2018 в 15:35
поделиться
  • 1
    Короткий тройственный синтаксис эквивалентен $x = isset($foo) ? isset($foo) : 'defaultvaluehere';, а не $x = isset($foo) ? $foo : 'defaultvaluehere'; – NikiC 14 July 2011 в 17:16
  • 2
    Argh. Правильно. Фиксация ответа сейчас ... – Marc B 14 July 2011 в 17:17
  • 3
    @Marc B Но это не работает, если false или пустая строка являются допустимыми значениями в словаре, не так ли? – phihag 14 July 2011 в 17:19
  • 4
    Это не работает. Короткий тройственный синтаксис по-прежнему генерирует ошибку NOTICE, когда переменная не определена, в отличие от функции isset. – Chris B. 24 June 2013 в 01:30
  • 5
    да, это не сработает. Тернарные операторы не дают неявных вызовов isset () – kdazzle 1 July 2013 в 20:43

«Немного» хакерский способ сделать это:

<?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']);

, но это еще хуже, чем оператор ==$_=&. Знаете, людям не нравится оператор подавления ошибок.

6
ответ дан NikiC 22 August 2018 в 15:35
поделиться

Мне полезно создать такую ​​функцию:

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 , но вы можете настроить его на все, что вам нужно.

Надеюсь, это полезно.

6
ответ дан rbento 22 August 2018 в 15:35
поделиться
  • 1
    Yup, array_key_exists было бы лучше вместо isset. – K-Gun 14 February 2015 в 03:07
  • 2
    Хорошо, спасибо, спасибо! – rbento 14 February 2015 в 05:34
  • 3
    Я бы рекомендовал переключить порядок $ array, $ key, поскольку встроенные функции имеют это, например, например. array_key_exists ($ key, $ array) – malhal 6 April 2015 в 21:08
  • 4
    маленькая ошибка, если это не массив, он возвращает false вместо default_value – malhal 6 April 2015 в 21:09

использовать оператор управления ошибкой @ с быстрой версией PHP 5.3 для тернарного оператора

$bar = @$foo['bar'] ?: 'defaultvalue';

16
ответ дан romanlv 22 August 2018 в 15:35
поделиться
  • 1
    Интересно. Что еще может пойти не так, за исключением синтаксических ошибок в такой небольшой части кода (что, возможно, не так драматично)? – Yauhen Yakimovich 24 June 2014 в 09:06
  • 2
    Я просто заметил этот шаблон в нашей кодовой базе. Он чувствует себя очень неправильно, но он работает. – André Laszlo 24 March 2015 в 17:44
  • 3
    Отличный ответ, спасибо! Мне нравится оператор @. – wulftone 29 May 2015 в 20:52
  • 4
    Обратите внимание, что все это временно устанавливается error_reporting(0) при оценке $foo['bar']. Он все равно будет вызывать обработчик ошибок, а обработчик ошибок должен игнорировать ошибку, если error_reporting() === 0. – Jesse 21 August 2015 в 12:28
  • 5
    Наверху с тобой! – L S 17 March 2016 в 22:12

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

$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
)

Чем больше клавиш / пары значений, которые вы перечисляете по умолчанию, тем лучше становится код-гольф.

2
ответ дан Rusty Fausak 22 August 2018 в 15:35
поделиться
  • 1
    хорошо, кажется слишком искусственным, не так ли? Будут делать работу, хотя – Yauhen Yakimovich 23 September 2011 в 19:35
  • 2
    Это действительно очень полезно для $_GET, например – user 30 November 2014 в 19:09
Другие вопросы по тегам:

Похожие вопросы: