Задать вопрос
  • Функция str_replace() не работает?

    @Vitsliputsli
    Проверяйте вашу строку на непечатные символы. У вас:
    string(275) "Хомут обжимной просечной (оцинкованная сталь) ширина 8 мм 3/4" (13-19 мм) – купить по цене завода. Доставка по РФ. Смотреть характеристики, фото, отзывы."

    У меня:
    string(271) "Хомут обжимной просечной (оцинкованная сталь) ширина 8 мм 3/4" (13-19 мм) – купить по цене завода. Доставка по РФ. Смотреть характеристики, фото, отзывы."

    гдето прячутся еще 4 байта, быть может quot это не 1-байтовая латиница, а чтото иное.
  • Как понять, что все сообщения в очереди обработаны?

    @Vitsliputsli
    Нужно разбираться в предметной области и текущей архитектуре. Возможно, лучше проверять результат работы воркеров, а не послыать сигнал, когда закончилось формирование очереди. Или, например, некий менеджер, который будет собирать информацию с воркеров, и по этим данным будет решать закончилась обработка или нет. Т.е. он знает сколько было отправлено заданий в очередь и от воркеров знает, сколько фактически сделано.

    В варианте с заданием-стопером вы создаете зависимость между брокером и воркерами, брокер должен всегда точно знать сколько работает воркеров. Возможно в вашей архитектуре это и не проблема.
    Другой момент, такое задание-стопер - это сигнал воркеру, который передается как обычное задание, нужно продумать ситуацию, когда задание-стопер не получилось распознать/обработать. Если ваша очередь останавливается при любой ошибке, то не проблема. Но, то что задание возвращается в очередь по тайм-ауту уже может добавить проблем.
    Также, из-за того что эти задания не предназначены определенному воркеру, то один воркер может обработать 2 задания-стопера, а второму не достанется ни одного. Нужно, чтобы задания-стоперы были адресованы конкретному воркеру.

    Что подразумевается под агрегатными задачами?
  • Как на стороне сервера узнать что клиент закрыл браузер?

    @Vitsliputsli
    Алексей Уколов, ненужный до тех пор, пока клиент разрывает соединение корректно, если автор хочет контролировать ситуацию, когда соединение разорвали ничего не отправив, то очень нужно.
  • Оффер в слепую - нормальная практика?

    @Vitsliputsli
    Как и в любом подобном вопросе, нормально или ненормально не имеет значения. Вас устраивает - идете на собеседование, не устраивает - не идете. Юридическая сторона, только если вы хотите судиться, но вряд ли это поможет в работе.
  • Что за ошибка PHP?

    @Vitsliputsli
    Точнее, не найден
    /d:/%D0%A1%D0%B0%D0%B9%D1%82%D1%8B/PHP/index.php

    Прям так, начиная со слеша, и везде используя слеш, вместо обратного слеша, и с кодами вместо кириллицы, хз допустимо ли 2 последних, но 1 точно ошибка.
  • Нужно ли стремиться обнулять переменные и по возможности не создавать их копий в проектах php?

    @Vitsliputsli
    Виктор Кожухарь, вряд ли чтобы "не заморачивались", указатели в языке с динамической типизацией бессмысленны. Если указатель будет указывать на значение, то непонятно что с ним делать без типа, т.е. без zval. А если ссылаться на zval, то его нужно обрабатывать, а это уже не указатель.
  • Нужно ли стремиться обнулять переменные и по возможности не создавать их копий в проектах php?

    @Vitsliputsli
    Слава, в php используется механизм Copy-On-Write, когда вы присваиваете новой переменной значение старой, то значение не копируется, а создается ссылка (почти такая, как если бы вы вручную указали ссылку), и только в момент когда вы начнете изменять новую переменную произойдет копирование значения. Т.е. если значения не менять, то все расходы - 16 байт, неважно для какого значения.
    Касательно удаления, то разумеется лучше делать unset, чтобы и значения и сама переменная были очищены. Чаще всего в этом нет нужды, т.к. переменные живут внутри функций или объектов и будут уничтожены при их завершении или уничтожении. Да, и чистка произойдет тогда, когда запустится мусорщик, поэтому если вы не выполняете долгих расчетов с большим кол-во данных внутри одного объекта, особой нужды делать unset нет.
  • Как решить проблему CURLOPT_SSL_VERIFYHOST?

    @Vitsliputsli
    Wsearch, CURLOPT_SSL_VERIFYHOST это глобальная константа, чтобы не подставлялся неймспейс вызывайте ее с полным путем \CURLOPT_SSL_VERIFYHOST
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,
    Мне не нужно передавать ссылку. Мне нужно совсем другое. Не надо пытаться подменить задачу только для того, чтобы код соответствовал выученной вами догме.

    Так забавно с вами что-либо обсуждать, никакой аргументации, только бессмысленные "бред", "догма", "мне не нужно", "только так правильно" и т.п. Нет ничего зазорного признать, что чего-то не знаешь.
    Вообще то нужна ссылка, очевидно, что изменение другой переменной, не изменит первоначальную, если передавать не по ссылке.

    Вы раньше производили впечатление адекватного человека, но сейчас я вижу что вы просто повторяете заученные религиозные догмы. Поскольку в большинстве случаев это работает, то отсутствие реального понимания не так бросалось в глаза.
    Как я уже говорил, аргументы против религии бесполезны, так что всего хорошего

    Ммм, переход на личности, думаете, так сможете спрятаться, не получится.
    Еще как есть, когда вы создаете массив внутри массива, будет создан новый zval массива, это совсем другой массив, с новой хеш-таблицей и новым списком. То что вам кажется, что оно "както само", нет, это не так. Поэтому, хотя ваши заявления "в большинстве случаев работают" (на самом деле только в примитивных ситуациях), у вас отсутствует "реальное понимание" как это работает, и будет ли вообще работать в более менее сложных ситуациях.
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,
    https://3v4l.org/i5RPC

    передавайте в переменную не значение, а ссылку:
    foreach ($array as $i => &$v) {
        if ($i === 0) {
            $array[1] = 3;
        }
        echo "$i: $v\n";
    }


    Переменная инициализирована.

    Эт понятно, только вот у вас не примитивный тип, а структура. И все эти вложенные массивы в структуре - отдельные zval, а то что мы явно не выделили имя переменной особо значения не имеет.
    Почему нужно я выше написал, если вы не считаете неявные манипуляции вердными, я переубеждать не буду.
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,
    Читайте внимательнее. Мне надо не для изменения. А для изменения, которое видно сразу, на по окончании перебора.

    Что значит "сразу", а не по "окончании перебора"? Вы изменили значение, как оно у вас "не сразу" будет видно? У нас же не транзакции. Вы бы хоть код привели, что имеете ввиду, а то все вытягивать нужно.

    Разумеется должна быть. Она там и есть. А эта строчка лишняя.

    Если вы инициализировали новый массив, то будет сразу видно, что он пустой и идет его наполнение. Если в неинициализированной переменной чтото будет до вычислений, это может привести к неожиданным эффектам. И да, пока у вас 3 строчки это кажется не особо нужным, но код имеет тенденцию расширяться по новым требованиям, и когда он усложнится, без этой строчки инициализации читать и отлаживать будет в разы сложнее.
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,
    Верно, именно поэтому замечание про "более лучше производительный" не имеет смысла и является скорее вредным, поскольку создает классическое суеверие.

    Откуда суеверие, если вы согласились, что это более производительный вариант? Вредным является утверждение, что с типами данных нужно работать не так, как они предполагают. Вы можете и числа держать в строках и использовать длинную арифметику, и это такое же безумие, как неиспользовать итерационные механизмы двусвязных списков просто потому что "и так сойдет".
    Когда вы такую практику будете применять на каждом шаге вашего кода, то очень быстро уже не нужен будет "электронный микроскоп", чтобы увидеть, что код работает неэффективно.

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

    Да, прочитайте наконец про итераторы! С чего вы взяли, что для изменения нужно обращаться по ключу? У вас курсор указывает на конкретный бакет, берите и меняйте, если надо.

    ну если так не видите, то просто уберите её из кода, и запустите его :)

    посмотрел, да, действительно, php неявно создаст массив, но я все равно оставил бы эту строчку, все таки инициализация должна быть явной.
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,
    Это не то замедление, о котором вообще стоит говорить.
    Вы его увидите только на цикле, который вообще нихчего не делает. Во всех остальных случаях вы его с электронным микроскопом не увидите.

    Есть такое выражение "экономить на спичках", когда мы начинаем оптимизировать то, что и так работает быстро, путем усложнения кода или других жертв. Здесь не тот случай, здесь просто ошибка, т.к. для обхода массива нужно использовать итератор.

    Бессмысленность строчки $result[$key] = []; - это для вас "тайное знание"? :)

    Да, не вижу как можно без нее обойтись. Покажите?
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    Ипатьев,

    ну это сказки же.
    и у вас тоже ненужные присвоения (:

    Foreach это итератор, он перебирает массив по ссылкам двусвязного списка, в for обращаемся по ключу (конкретно в этом коде, можно было бы и в цикл for добавить итератор, но тогда он еще более бесмыссленым становится), а значит идти придется через хеш-таблицу, а не сразу по прямой ссылке. Лишнее действие будет замедлять работу.
    Если код можно еще улучшить, так покажите, а не кичитесь "тайным знанием".
  • Как сгруппировать значения в массиве и получить среднее арифметическое для определенного поля?

    @Vitsliputsli
    Почти то же самое, но без 2х обходов массива:
    $result = [];
    foreach ($arr as $obj) {
        $idPublic = $obj['id_public'];
        if (isset($result[$idPublic])) {
            $result[$idPublic]['number'] = ($result[$idPublic]['number']+$obj['number'])/2;
        } else {
    	$result[$idPublic] = [
    		'id_public' => $idPublic,
    		'number' => $obj['number'],
    	];
        }
    }


    Если нужно просто среднее по каждому (без структуры), то можно еще проще:
    $result = [];
    foreach ($arr as $obj) {
        $idPublic = $obj['id_public'];
        if (isset($result[$idPublic])) {
            $result[$idPublic] = ($result[$idPublic]+$obj['number'])/2;
        } else {
    	$result[$idPublic] = $obj['number'];
        }
    }


    Если исходный массив отсортирован по id_public, то можно избавиться от множественных обращений к массиву по ключу.
  • Как собрать массив массивов, имея массивы ключей, ключей и значений вложенных массивов?

    @Vitsliputsli
    danilapon, в вашем коде есть ненужные присвоения, выкинув их можно записать так:
    foreach ($input as $i => $key) {
        $result[$key] = [];
        foreach ($params as $j => $param) {
            $result[$key][$param] = $arrays[$j][$i];
        }
    }

    Добавлю, foreach не только удобнее, он и более производительный при обходе массива, чем for.
  • Как отобразить первичный ключ состоящий из вторичных?

    @Vitsliputsli
    Kotorkovsciy, ваше отношение это Device к Event. Здесь видим только часть реализации этого отношения - техническую таблицу, а для определения соответствия нормальной форме нужно все отношение.
    Если предполагаем, что больше ничего нет, а 2 поля это натуральные ключи, то очевидно соответствие 1 форме, а так как нет неключевых атрибутов, то и 2, и 3.
  • Как перезагружать страницу при появлении определённого элемента?

    @Vitsliputsli
    Нужно разделять логику и отображение. Поэтому пркручивать нужно не к "затемнению экрана", а к логике его вызывающей, которая определила, что данные устарели.
  • Можно ли запустить WebSocket по переходу на страницу?

    @Vitsliputsli
    Временный он потому что он действует пока открыта страница в браузере или пока есть соединение в самим сокетом.

    Вы описываете решение, а не задачу. А про задачу спрашивают, потому что зная ее, возможно, решать надо другим способом. Так, я не вижу причин, почему бы ws-сокет демону не работать постоянно, на то он и демон.
    Выглядит очень странно, но в чем проблема? Пришел запрос по http - запускаете демона, демон видит, что все отключились - закрывается.
    Дополнительно, нужно посмотреть как настроить systemd unit, чтобы он перезапускался только при ошибке. И если клиент отвалился некорректно, то контролировать это, либо забить, если быстрая реакция не важна.
  • Как правильно задать запрос UPDATE где название столбца переменная?

    @Vitsliputsli
    Ипатьев, не любое, но вы сделали именно так. Согласен, спорить с тем, кто на каждый вопрос отвечает "я всегда прав, и потому не буду даже ничего аргуметировать" бесполезно.
    Аргументы "это все говнокод" и "вы бредите" вовсе не аргументы. Назовите вашу схему хоть "зеленым горошком", но аргументируйте почем она в работе лучше, а все остальные плохие. Пока ваши утверждения, выглядят как гадания с помощью хрустального шара. Уже много раз писал, не зная как данные будут использоваться, что-либо утверждать наверняка беспочвенно. А спорю, потому что, действительно, мог чтото упустить, чего то не знать, иногда так и узнаю новое.