Если в базе у нас объекты одного типа, а «фиктивные» объекты имеют другой тип
И потом, через месяца два взглянув на код, будет сложно понять, почему одни идентификаторы фиктивные, а другие нет. Лучше бы уж они являлись экземплярами пользовательских классов, типа Id и MockId, а не имели типы «число» и «строка».
С точки зрения математики это — не упорядоченный массив. А вот с точки зрения PHP — вполне себе упорядочнный.
В мане по PHP написано, что не следует использовать функцию sort для сортировки массивов с разнородными элементами, по-скольку результат может быть непредсказуем. Потому утверждение «А вот с точки зрения PHP — вполне себе упорядочнный» — неверно. К тому же у sort имеется второй аргумент, который позволяет управлять способом сортировки. Скажите, а что если упорядочивать не просто множество из строк и чисел, а вообще из произвольных объектов, то там отношения "<" и ">" будут отношениями порядка? Я имею ввиду именно встроенные, а не перегруженные.
Где отношения порядка нетранзитивны, а сортировка имеет другой смысл нежели в математике.
Список возможных отношений порядка не заканчиваются на "<" и ">".
В базе ID'шники хранятся как числа, вновь созданные объекты имеют числовые ID'шники
Должно быть, вы имели ввиду «вновь созданные объекты имеют строковые ID'шники»?
Вы немного не поняли. Вы привели не ту задачу, в которой необходимо упорядочивать именно разнородное множество, вы привели лишь задачу, в которой язык программирования ведет себя не так, как вы ожидали вследствие вашей же невнимательности. Не знаю, как вас, но вот лично меня несколько смущает, что одни и те же объекты хранятся в одном множестве, имея при этом разный тип (это я про ID'шники).
Час от часу не легче. То есть в PHP у нас вызов функции sort() не создают отсортированный массив? Это — новаторский подход, конечно…
Не знаю, в чем заключается новаторский подход.
В математике частично упорядоченным множеством называется множество, на котором определено отношение частичного порядка. Еще раз повторю, что в PHP отношения "<" и ">" не являются отношениями частичного порядка на смешанных множествах, состоящих из строк и чисел одновременно. Значит массив array("11", "a", 2, 3) не является упорядоченным с математической точки зрения. Укажите, где я не прав.
Не могли бы вы описать реальную задачу, решая которую вы столкнулись с этой «проблемой»? Задачу, в которой вам необходимо сортировать множество из разнородных элементов.
Я и играю. Получаю маразм. Это вы «меняете правила игры» задавая свою функцию сортировки. Если потом проверить отсортированность массива по «правилам игры языка» — он окажется не отсортированным.
Вообще-то определение «упорядоченный» не указывает, каким конкретно образом множество упорядочивается, главное, чтобы это было отношение порядка.
Вы уже поменяли пример в топике, теперь ясно, как вы его упорядочили (раньше было неясно).
А как вы ещё назовете множество с операциями больше и меньше?
Если отношения ">" и "<" не являются транзитивными, то и множества, на котором эти отношения определены, не являются упорядоченными. В PHP эти отношения не являются отношениями порядка (для смешанных множеств) вследствие их нетранзитивности, а значит и приведенные вами в качестве примера массивы не упорядочены.
а сортировать в одной последовательности числа и строки произвольно изменяя операцию сравнения чисел на операцию сравнения строк, это как сортировать купюры (разных образцов) и монеты, то по весу, то по номиналу.
Думаю, что можно определить такое отношение порядка, которое позволит упорядочить смешанное множество, состоящее из строк и чисел. Только вот, например, в PHP, отношение "<" действительно не является отношением порядка (для смешанных множеств), так как: var_dump('asd' < 1); // true
var_dump(1 < '2a'); // true
var_dump('asd' < '2a'); // false
Так если для сортировки использовалось описанное вами отношение, то оно нетранзитивное: $before = array(7, "13", "5", 6);
7 < "13" // 7 как число меньше, чем строка "13", приведённая к числу
"13" < "5" //"13" как строка меньше, чем "5" как строка (типа, лексикографически)
Но, 7 > "5" // 7 как число больше, чем строка "5", приведённая к числу
Так как оотношение нетранзитивное, почему множество, на котором оно определено, называется упорядоченным?
Для сортировки в обоих случаях не применяется обычные операторы сравнения. Просто там некоторые элементы после «сортировки» будут идти не по порядку (в смысле могут быть случаи когда a[i]<a[i+1]>a[i+2] в «отсортированном» массиве).
Если сортировать приведенный вами в примере массив $before с помощью операторов сравнения, то получится массив array("5", 6, 7, "13"), где тут случай «a[i]<a[i+1]>a[i+2]»? "5" < 6 == true
6 < 7 == true
7 < "13" == true
Пожалуйста, поясните, почему у вас array(7, "13", "5", 6) является отсортированным? И какой функцией вы его сортировали?
То есть вы всё-таки согласны, что подсознание должно являться отдельной областью памяти, которая хранит, мм, текущее «состояние» и некоторые «зашитые» действия, и аппаратом, который этой памятью оперирует?
Всё это я к чему: вы не рассматривали такой случай, что в процессе мышления и иных операций с узлами в памяти возникнут искажения, обусловленные всякими лишними данными, которые хранятся тут же, но за которые по идее должно было быть ответственны подсознание? И то, что вы используете корневой узел, означает, что через этот узел можно от одних данных дойти до других.
Да, согласен, но вот вы пишите: «Через секунду вы об этом думать уже не будете». Если взять за пример походку, вы можете идти и одновременно считать в уме интегралы, при том ещё и следить за дорогой. Все эти три компоненты никак между собой не связаны (кроме как признака «сейчас»), а так как вы предлагаете всё, включая подсознание, помещать в «дерево» (не совсем дерево, скорее некоторое подобие графа) с одним общим корневым узлом, то получается, что они всё таки связаны. А при том поступающей и неявно анализируемой информации может быть куда больше.
Короче говоря, я не понял, почему вы сознание, подсознание и прочее обозвали одним, хотя на деле они выполняют разные функции. Не могли бы вы пояснить такое решение?
Ага! А ещё есть все наши привычки, комплексы, предубеждения, реакции — всем этим, мне кажется, управляет подсознание. Так что говорить, что в подсознании ничего не задерживается, на мой взгяд, неправильно.
Хм, да, наверное вы правы, раз уж автор объеденил подсознание с краткосрочной памятью в одну единственную «оперативную». Но тогда непонятно, если подсознание ответственно за безусловные рефлексы, то оно под определение «оперативной» памяти никак не попадает, зачем его туда включать?
Ну так если взглянуть в сторону нас — людей, то мы в своей краткосрочной памяти можем запомнить и манипулировать приблизительно семью объектами. Потому лично я думаю, что недостатка ресурсов для оперативной памяти не возникнет, как, впрочем и для долговременной. А насчет скорости доступа, скажем, иногда бывает трудновато что либо вспомнить, причём на это может уходить достаточно большое время. Таким образом я считаю, что вообще нет проблемы ни в недостатке ресурсов, ни в скорости обмена информацией между ними.
И ещё, хотел задать вам вопрос, почему вы поставили раздел «Общение» после «Мотивации» и «Воспоминания», ведь если у системы не будет связи с внешнем миром, то как же её тестировать и наполнять информацией?
Вы уверены, что не допустили ошибок при написании тестов? Во-первых, насколько я помню, приоритет у конкатенации такой же, как у сложения и у вычитания, а потому: echo 'With Typehint: ' . $end - $start . ' sec.';
исходя из ассоциативности, превращается в echo (('With Typehint: ' . $end) - $start) . ' sec.';
на что получаем неожиданный результат…
И ещё функцию test два раза определили.
Букву «u» пропустили: private function __constrct() {}
И ещё, раз уж используете PHP5, то используйте первый аргумент get_as_float у функции microtime.
По теме: больше половины времени отжирает preg_match, мне удалось немного ускорить ваш код, заменив: if (preg_match( '/^Argument \d+ passed to .*? must be an instance of (\w+), (\w+) given/', $msg, $m)) {
return (isset( self::$_types[$m[1]]) && self::$_types[$m[1]] == $m[2]);
}
на if ($lvl == E_RECOVERABLE_ERROR && strstr($msg, 'must be an instance of') !== false) {
$errmsg = explode(' ', $msg, 13);
return isset(self::$_types[$errmsg[10]]) && self::$_types[$errmsg[10]] == $errmsg[11];
}
Так вот, линейный блоковый код, который гарантированно выявит ошибку в одном бите, теория вкратце:
y*G=v, y — битовый вектор, который необходимо закодировать, G — порождающая матрица особого вида: G = [I|R], v — полученный вектор с проверочной частью в конце. Чтобы проверить правильность пришедшей информации (которая, в этом случае, состоит из 7 бит), необходимо вычислить вектор «синдрома» s = v*H, где H — проверочная матрица вида H = [RT, I], I — еденичная матрица. Если вектор синдрома не является нулевым, то информация с ошибкой. Чтобы найти тот бит, в котором ошибка, достаточно сделать следующее: найти битовый вектор вида f=(0, 0, ..., 1, 0, ...), который при умножении на H даст полученный «синдром» s: f*H == s. Например, f= (0, 1, 0, 0, 0, 0, 0) означает, что ошибка в 6 бите (с конца).
И потом, через месяца два взглянув на код, будет сложно понять, почему одни идентификаторы фиктивные, а другие нет. Лучше бы уж они являлись экземплярами пользовательских классов, типа Id и MockId, а не имели типы «число» и «строка».
В мане по PHP написано, что не следует использовать функцию sort для сортировки массивов с разнородными элементами, по-скольку результат может быть непредсказуем. Потому утверждение «А вот с точки зрения PHP — вполне себе упорядочнный» — неверно. К тому же у sort имеется второй аргумент, который позволяет управлять способом сортировки. Скажите, а что если упорядочивать не просто множество из строк и чисел, а вообще из произвольных объектов, то там отношения "<" и ">" будут отношениями порядка? Я имею ввиду именно встроенные, а не перегруженные.
Список возможных отношений порядка не заканчиваются на "<" и ">".
Реальную задачу, кстати, так и не привели.
Должно быть, вы имели ввиду «вновь созданные объекты имеют строковые ID'шники»?
Вы немного не поняли. Вы привели не ту задачу, в которой необходимо упорядочивать именно разнородное множество, вы привели лишь задачу, в которой язык программирования ведет себя не так, как вы ожидали вследствие вашей же невнимательности. Не знаю, как вас, но вот лично меня несколько смущает, что одни и те же объекты хранятся в одном множестве, имея при этом разный тип (это я про ID'шники).
Не знаю, в чем заключается новаторский подход.
В математике частично упорядоченным множеством называется множество, на котором определено отношение частичного порядка. Еще раз повторю, что в PHP отношения "<" и ">" не являются отношениями частичного порядка на смешанных множествах, состоящих из строк и чисел одновременно. Значит массив
array("11", "a", 2, 3)
не является упорядоченным с математической точки зрения. Укажите, где я не прав.Не могли бы вы описать реальную задачу, решая которую вы столкнулись с этой «проблемой»? Задачу, в которой вам необходимо сортировать множество из разнородных элементов.
Вообще-то определение «упорядоченный» не указывает, каким конкретно образом множество упорядочивается, главное, чтобы это было отношение порядка.
Если отношения ">" и "<" не являются транзитивными, то и множества, на котором эти отношения определены, не являются упорядоченными. В PHP эти отношения не являются отношениями порядка (для смешанных множеств) вследствие их нетранзитивности, а значит и приведенные вами в качестве примера массивы не упорядочены.
Думаю, что можно определить такое отношение порядка, которое позволит упорядочить смешанное множество, состоящее из строк и чисел. Только вот, например, в PHP, отношение "<" действительно не является отношением порядка (для смешанных множеств), так как:
var_dump('asd' < 1); // true
var_dump(1 < '2a'); // true
var_dump('asd' < '2a'); // false
Видимо это до нас пытается донести автор?
$before
упорядоченным массивом.Так что ваш код немного не то проверяет.
$before = array(7, "13", "5", 6);
7 < "13" // 7 как число меньше, чем строка "13", приведённая к числу
"13" < "5" //"13" как строка меньше, чем "5" как строка (типа, лексикографически)
Но, 7 > "5" // 7 как число больше, чем строка "5", приведённая к числу
Так как оотношение нетранзитивное, почему множество, на котором оно определено, называется упорядоченным?
Если сортировать приведенный вами в примере массив $before с помощью операторов сравнения, то получится массив
array("5", 6, 7, "13")
, где тут случай «a[i]<a[i+1]>a[i+2]»?"5" < 6 == true
6 < 7 == true
7 < "13" == true
Пожалуйста, поясните, почему у вас
array(7, "13", "5", 6)
является отсортированным? И какой функцией вы его сортировали?Короче говоря, я не понял, почему вы сознание, подсознание и прочее обозвали одним, хотя на деле они выполняют разные функции. Не могли бы вы пояснить такое решение?
И ещё, хотел задать вам вопрос, почему вы поставили раздел «Общение» после «Мотивации» и «Воспоминания», ведь если у системы не будет связи с внешнем миром, то как же её тестировать и наполнять информацией?
echo 'With Typehint: ' . $end - $start . ' sec.';
исходя из ассоциативности, превращается в
echo (('With Typehint: ' . $end) - $start) . ' sec.';
на что получаем неожиданный результат…
И ещё функцию test два раза определили.
Букву «u» пропустили:
private function __constrct() {}
И ещё, раз уж используете PHP5, то используйте первый аргумент get_as_float у функции microtime.
По теме: больше половины времени отжирает preg_match, мне удалось немного ускорить ваш код, заменив:
if (preg_match( '/^Argument \d+ passed to .*? must be an instance of (\w+), (\w+) given/', $msg, $m)) {
return (isset( self::$_types[$m[1]]) && self::$_types[$m[1]] == $m[2]);
}
на
if ($lvl == E_RECOVERABLE_ERROR && strstr($msg, 'must be an instance of') !== false) {
$errmsg = explode(' ', $msg, 13);
return isset(self::$_types[$errmsg[10]]) && self::$_types[$errmsg[10]] == $errmsg[11];
}
и
private static $_types = array(
'boolean' => 'boolean',
'bool' => 'boolean',
'integer' => 'integer',
'int' => 'integer',
'float' => 'float',
'string' => 'string',
'resource' => 'resource'
);
на
private static $_types = array(
'boolean,' => 'boolean',
'bool,' => 'boolean',
'integer,' => 'integer',
'int,' => 'integer',
'float,' => 'float',
'string,' => 'string',
'resource,' => 'resource'
);
y*G=v, y — битовый вектор, который необходимо закодировать, G — порождающая матрица особого вида: G = [I|R], v — полученный вектор с проверочной частью в конце. Чтобы проверить правильность пришедшей информации (которая, в этом случае, состоит из 7 бит), необходимо вычислить вектор «синдрома» s = v*H, где H — проверочная матрица вида H = [RT, I], I — еденичная матрица. Если вектор синдрома не является нулевым, то информация с ошибкой. Чтобы найти тот бит, в котором ошибка, достаточно сделать следующее: найти битовый вектор вида f=(0, 0, ..., 1, 0, ...), который при умножении на H даст полученный «синдром» s: f*H == s. Например, f= (0, 1, 0, 0, 0, 0, 0) означает, что ошибка в 6 бите (с конца).
Кто желает проверить, вот, например, матрица G:
1 0 0 0 0 1 1
0 1 0 0 1 1 0
0 0 1 0 1 0 1
0 0 0 1 0 0 1
Умножать везде стоит «по модулю 2».