PHP Получают минимальные и максимальные значения в 2D ассоциативном массиве

Какую версию C Вы используете?

В C90, общепринятая практика состоит в том, чтобы бросить к со знаком или длинному неподписанному, как соответствующая, и печать соответственно. Я видел %z для size_t, но Harbison и Steele не упоминают это под printf (), и в любом случае который не помог бы Вам с ptrdiff_t или что бы то ни было.

В C99, различные типы _t идут со своими собственными printf макросами, таким образом, что-то как "Size is " FOO " bytes." я не знаю детали, но это - часть довольно большого числового формата, включают файл.

8
задан James B 28 August 2009 в 06:19
поделиться

6 ответов

Обычно у вас будет каталог, имя которого является именем вашего пакета, где-то на вашем PYTHONPATH. Например:

eulerproject/
    euler/
        __init__.py
        euler1.py
        ...
        tests/
            ...
    setup.py

Затем вы можете либо установить его в масштабе всей системы, либо установить PYTHONPATH = / path / to / eulerproject /: $ PYTHONPATH при вызове вашего скрипта.

Абсолютный импорт, например это будет работать:

from euler import euler1

Edit :

Согласно документам Python, «модули, предназначенные для использования в качестве основного модуля приложения Python, всегда должны использовать абсолютный импорт». ( Цитируйте )

Таким образом, тестовый набор, такой как нос , упомянутый в другом ответе, работает, потому что он импортирует пакеты, а не запускает их из командной строки.

Если вы Если вы хотите что-то делать вручную, ваш исполняемый скрипт должен находиться за пределами иерархии пакетов, например:

eulerproject/
    runtests.py
    euler/
        __init__.py
        euler1.py
        ...
        tests/
            __init__.py
           testeulern.py

Теперь runtests. не определено для других типов. Не полагаться на любое наблюдаемое поведение, поскольку оно могут быть изменены без предварительного уведомления.

Мое утверждение выше о приведении типов было неверным. На самом деле min () и max () действительно работают с массивами, но не так, как они нужны OP. При использовании min () и max () с несколькими массивами или массивом массивов элементы сравниваются элемент за элементом слева направо:

$val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)
/*
 * first element compared to first element: 2 == 2
 * second element compared to second element: 4 < 5
 * first array is considered the min and is returned
 */

В переводе на проблему OP это показывает причина, по которой прямое использование min () и max () , кажется, дает правильный результат. Первыми элементами массивов являются значения id , поэтому min () и max () будут сравнивать их первыми, случайно приводя к правильному результату, потому что самый низкий id - это тот, у которого самый низкий счет , а самый высокий id - тот, у которого наибольшее счетчик .

END EDIT


Правильный способ - использовать цикл.

$a = array(
        array('id' => 117, 'name' => 'Networking', 'count' => 16),
        array('id' => 188, 'name' => 'FTP', 'count' => 23),
        array('id' => 189, 'name' => 'Internet', 'count' => 48)
);
$min = PHP_INT_MAX;
$max = 0;
foreach ($a as $i) {
    $min = min($min, $i['count']);
    $max = max($max, $i['count']);
}
6
ответ дан 5 December 2019 в 22:19
поделиться

Вы можете использовать функции max () и min () .

0
ответ дан 5 December 2019 в 22:19
поделиться

Что вы сделали с несколькими петлями? Одного вполне достаточно :)

  1. Получите первый элемент, присвоив счет как $ min, так и $ max
  2. перебирая все остальные, сравните счетчик с каждым $ min и $ max, если он меньше / больше, назначьте новый значение счетчика
0
ответ дан 5 December 2019 в 22:19
поделиться

Похоже, вы не можете использовать max () в 2D-массиве. Он просто возвращает самый большой массив, а не max () каждого индекса (как упоминалось в нескольких ответах).

Итак:

$count = array();
foreach($arr as $_arr) {
    $count[] = $_arr['count'];
}
var_dump(max($count), min($count));
0
ответ дан 5 December 2019 в 22:19
поделиться

Вы можете использовать функции max / min , поскольку они возвращают массив, содержащий максимум / минимум каждого индекса. Ваш пример должен вернуть array (189, 'Networking ', 48) для max . Затем вы можете получить счетчик из этого массива.


Обновите, это не работает, как я исключил. Пример страницы руководства вводит в заблуждение, и пример дает правильный результат с использованием max, но это просто совпадение.

0
ответ дан 5 December 2019 в 22:19
поделиться

Есть ли аналогичная встроенная функция для этой функции? (даже без возможности теста )

/**
 * extracts a column from a 2D array, with an optional selection over another column
 *
 * @param $aArray     array to extract from
 * @param $aColName   name of the column to extract, ex. 'O_NAME'
 * @param $aColTest   (optional) name of the column to make the test on, ex. 'O_ID'
 * @param $aTest      (optional) string for the test ex. ">= 10", "=='".$toto."'"
 * @return            1D array with only the extracted column
 * @access public
 */

 function extractColFromArray($aArray, $aColName, $aColTest="", $aTest="") {
  $mRes = array();
  foreach($aArray as $row) {
   if (($aColTest == "") || (eval("return " . $row[$aColTest] . $aTest . ";" )) ) {
    $mRes[] = $row[$aColName];
   }
  }
  return $mRes;
 } // extractColFromArray
0
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

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