Nano Hash - криптовалюты, майнинг, программирование

Найдите позицию внутри этого запроса Yii 2

У меня есть следующий запрос Yii 2

$find = People::find()->where(['c_id' => $c_id])->orderBy('totals DESC, id DESC')->all();

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

Поскольку он отсортирован по «итогом», я, по сути, хочу вернуть позицию в массиве, где я могу найти этот конкретный идентификатор.

В настоящее время я использую этот код.

foreach ($find as $t) {
    $arr[] = $t->id;

    if ($t->id == $id) {
        break;
    }
}

$key = count($arr);

return $key;

Тем не менее, этот код не подходит для запроса результатов более 100 000.

Есть ли способ ускорить это?

13.11.2017

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

Ответы:


1

Вы можете получить результат в виде массива (вместо объекта) как

$find = People::find()->where(['c_id' => $c_id])
        ->orderBy('totals DESC, id DESC')
        ->asArray()
        ->all();

тогда вы можете найти свое значение, используя array_search()

$my_index =  array_search($id,$find);

но для 100k+ вы должны использовать прямой выбор в db... вместо того, чтобы зацикливаться на php или загружать все в php и сканировать с помощью array_search()

13.11.2017
  • Как сделать прямой выбор в БД? 13.11.2017
  • Вы можете использовать команду sql непосредственно в Yii2 или activeRecord findBuSql.. или ActiveQuery... есть несколько способов.. в конечном итоге обновите свой вопрос с помощью кода sql (или псевдокода), который вам нужен 13.11.2017
  • Ваш $my_index всегда показывает ноль, я полагаю, потому что $find - это не просто одномерный массив, поэтому он не может найти ключ? Я не уверен на 100%. 13.11.2017
  • может быть, это еще одна причина избегать цикла или поиска в ассоциативном массиве 13.11.2017

  • 2

    Чтобы получить массив из запроса в YII, вы можете использовать queryAll();

    $find = People::find()->where(['c_id' => $c_id])->orderBy('totals DESC, id DESC')->queryAll();
    

    ИЛИ, другой способ преобразовать объект в массив:

    $find = json_decode(json_encode($find), true);  // to convert all data into array.
    

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

    Вы можете использовать функцию array_search(), чтобы получить индекс вашего значения.

    $a=array("a"=>"red","b"=>"green","c"=>"blue");
    echo array_search("red",$a);
    

    Функция array_search() ищет в массиве значение и возвращает ключ.

    13.11.2017
  • Однако $find — это не массив, верно? Я считаю, что наибольшую нагрузку на эту функцию вызывает создание самого массива. Или я ошибаюсь? 13.11.2017
  • Вы можете проверить, является ли $find массивом или нет. используйте 1_ 13.11.2017
  • @kevinkt, ты проверял это? 13.11.2017
  • Да, ошибка такова: array_search() ожидает, что параметр 2 будет массивом, заданным объектом 13.11.2017
  • О, это означает, что ваш запрос дает набор объектов, а не массив. проверьте мой обновленный ответ, чтобы исправить это. 13.11.2017
  • Однако это двумерный массив. Мой ключ находится во втором измерении. 13.11.2017

  • 3

    Возможно, я вас неправильно понял, но я предполагаю, что вы пытаетесь обнаружить index или key для желаемого id внутри array, возвращаемого из запроса SQL, который отсортирован по какому-то другому столбцу, например total.

    Итак, давайте получим записи из базы данных с вашим запросом с небольшим изменением asArray() нравится это

    $find = People::find()
    ->where(['c_id' => $c_id])
    ->orderBy('totals DESC, id DESC')
    ->asArray()
    ->all();
    

    в результате предположим, что таблица People возвращает вам массив со следующим набором данных, упорядоченным по столбцам total и id DESC.

    [
        0 => [
            'id' => 2 ,
            'c_id'=>2,
            'name' => 'John' ,
            'age'=>18,
            'totals'=>100,
        ],
        1=>[
            'id'=>1,
            'c_id'=>55,
            'name'=>'Bob',
            'age'=>20,
            'totals'=>80,
        ],
        2=>[
            'id'=>3,
            'c_id'=>85,
            'name'=>'Peter',
            'age'=>15,
            'totals'=>75,
        ]
    ];
    

    Теперь, если вы посмотрите на \yii\helpers\ArrayHelper вы найдете ArrayHelper::getColumn().

    Давайте применим это к массиву, который мы получили из запроса. Я предполагаю, что вы ищете $id внутри столбца id, поэтому мы сначала отфильтруем столбец id, как показано ниже.

    $idsArray = ArrayHelper::getColumn($find, 'id');

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

    [2,1,3]

    затем воспользуемся встроенной функцией php array_search()

    $key=array_search($yourId,$idsArray);

    Надеюсь, это то, что вы ищете.

    13.11.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..