1

status = 0 (評価されていない画像)およびstatus != 1 (評価された画像)という条件で、多次元配列内で変更日の降順 (最新のものを意味する) で並べ替えようとしています。

上位2つが以下のロジックに従うように配列をソートすることは可能ですか:

If (there are multiple versions of an image)
   If (there is a version that has been rated)
      If (there is a new unrated version of the image)
         Display (the most recent version that has a rating) and 
         (the most recent unrated version) as top 2 of array
      Else
         Display (the most recent version that has a rating) as top 1
   Else
      Display (the most recent unrated version) as top 1
Else
   Display (the only version) as top 1

これが私の更新されたPHPコードです(2013年9月6日更新)

updateImageDisplayStatus($caseID,$patientID);

function updateImageDisplayStatus($caseid,$patientid) {

$connection = getMySqlConnection();
$sql = "SELECT image_name FROM images WHERE patientid = '{$patientid}' AND caseid = '{$caseid}' ";

$imageGroup = array();
$result = mysql_query($sql,$connection);
while($row = mysql_fetch_assoc($result)) {

    $fileName =  $row['image_name'];
    $tmpName = $row['image_name'];
    list($leftN,$rightN) = explode($caseid."_",$tmpName);
    //$spltName = explode('_',$rightN);
    $shortFileName = $rightN;
    list($noExtensionFileName,$extension) = explode('.',$shortFileName);
    //$extension = '.nii.gz';
    list($groupName,$appendDate) = explode('_',$noExtensionFileName);
    // echo $groupName = just the original name.

  $sql_2 = "SELECT image1.image_name as i1_image_name
  ,image1.comments   as i1_comments
  ,image1.status     as i1_status
  ,image1.mod_date   as i1_mod_date
  ,image2.image_name as i2_image_name
  ,image2.comments   as i2_comments
  ,image2.status     as i2_status
  ,image2.mod_date   as i2_mod_date
  FROM (SELECT CASE WHEN status = 0 THEN 1 ELSE 0 END as rated
          ,image_name
          ,comments
          ,status
          ,mod_date
      FROM images
     WHERE image_name like '%{$groupName}%' 
     ORDER BY 1 ASC, mod_date DESC
     LIMIT 1
   ) image1
  LEFT OUTER
  JOIN images image2
    ON image1.status > 0
   AND image2.status = 0
   AND image2.mod_date > image1.mod_date
   AND image2.image_name like '%{$groupName}%'
      AND patientid = '{$patientid}' AND caseid = '{$caseid}'
 ORDER BY image2.mod_date DESC
 LIMIT 1";

$result_2 = mysql_query($sql_2,$connection);
if($row = mysql_fetch_assoc($result_2)) {
    $imageGroup[$groupName]   = array();
    $imageGroup[$groupName][] = array(
        'image_name'  => $row['i1_image_name'],
        'comments'    => $row['i1_comments'], 
        'status'      => $row['i1_status'],
        'mod_date'    => $row['i1_mod_date']
        );
    if ( !empty( $row['i2_image_name'] ) ) {
        $imageGroup[$groupName][] = array(
            'image_name'  => $row['i2_image_name'],
            'comments'    => $row['i2_comments'], 
            'status'      => $row['i2_status'],
            'mod_date'    => $row['i2_mod_date']
        );
    }
}
echo "Group $groupName:<br />";
echo "Size of Group:".sizeof($imageGroup[$groupName]).'<br />';

echo $imageGroup[$groupName][0]['image_name'].'<br />';
echo $imageGroup[$groupName][1]['image_name'].'<br />';
}
}

アップデート:

SQLに仕事を任せる提案をしてくれた@gwcに感謝します。検索およびソートされる 1 ~ 2 枚の画像は、指定された $caseid および $patientid 内にある必要があることを付け加えるのを忘れていました。その結果、最初の sql ステートメントは次のようになります。$sql = "SELECT image_name FROM images WHERE patientid = '{$patientid}' AND caseid = '{$caseid}' ";

4

2 に答える 2

1

同じ患者とケース内に制限するように SQL を更新しました

私が問題を正しく理解していれば、SQL に作業を任せることができます。ループや配列は必要ありません。次の SQL は、単一の行を返す必要があります。残念ながら、現時点ではこれをテストする方法がないため、SQL にエラーがないことを願っています。この SQL は $sql_2 を置き換えます:

SELECT image1.patientid
      ,image1.caseid
      ,image1.image_name as i1_image_name
      ,image1.comments   as i1_comments
      ,image1.status     as i1_status
      ,image1.mod_date   as i1_mod_date
      ,image2.image_name as i2_image_name
      ,image2.comments   as i2_comments
      ,image2.status     as i2_status
      ,image2.mod_date   as i2_mod_date
  FROM (SELECT CASE WHEN status = 0 THEN 1 ELSE 0 END as rated
              ,patientid
              ,caseid
              ,image_name
              ,comments
              ,status
              ,mod_date
          FROM images
         WHERE patientid  = '{$patientid}'
           AND caseid     = '{$caseid}'
           AND image_name like '%{$group_name}%'
         ORDER BY 1 ASC, mod_date DESC
         LIMIT 1
       ) image1
  LEFT OUTER
  JOIN images image2
    ON image1.status     > 0
   AND image2.patientid  = image1.patientid
   AND image2.caseid     = image1.caseid
   AND image2.status     = 0
   AND image2.mod_date   > image1.mod_date
   AND image2.image_name like '%{$group_name}%'
 ORDER BY image2.mod_date DESC
 LIMIT 1

返される行には 10 列が含まれます。

  • 患者ID
  • ケースID
  • i1_image_name
  • i1_コメント
  • i1_ステータス
  • i1_mod_date
  • i2_image_name
  • i2_コメント
  • i2_ステータス
  • i2_mod_date

i1_* 列は最初の画像からのもので、i2_* 列は 2 番目の画像 (ある場合) からのものです。評価された画像がある場合、i1_* は最近変更された評価された画像を表し、i2_* は i1_* 画像の後に変更された最新の未評価の画像を表します。評価された画像の後に変更された評価されていない画像がない場合、i2_* は NULL になります。評価された画像がない場合、i1_* は最近変更された評価されていない画像を表し、i2_* は NULL になります。

更新しました

これが私がそれを使用している方法です。

    $sql_2 = "SELECT image1.patientid
      ,image1.caseid
      ,image1.image_name as i1_image_name
      ,image1.comments   as i1_comments
      ,image1.status     as i1_status
      ,image1.mod_date   as i1_mod_date
      ,image2.image_name as i2_image_name
      ,image2.comments   as i2_comments
      ,image2.status     as i2_status
      ,image2.mod_date   as i2_mod_date
  FROM (SELECT CASE WHEN status = 0 THEN 1 ELSE 0 END as rated
              ,patientid
              ,caseid
              ,image_name
              ,comments
              ,status
              ,mod_date
          FROM images
         WHERE image_name like '%{$group_name}%'
         ORDER BY 1 ASC, mod_date DESC
         LIMIT 1
       ) image1
  LEFT OUTER
  JOIN images image2
    ON image1.status > 0
   AND image2.patientid  = image1.patientid
   AND image2.caseid     = image1.caseid
   AND image2.status     = 0
   AND image2.mod_date   > image1.mod_date
   AND image2.image_name like '%{$group_name}%'
 ORDER BY image2.mod_date DESC
 LIMIT 1";

    $result_2 = mysql_query($sql_2,$connection);
    if($row = mysql_fetch_assoc($result_2)) {
        $imageGroup[$groupName]   = array();
        $imageGroup[$groupName][] = array(
            'image_name'  => $row['i1_image_name'],
            'comments'    => $row['i1_comments'], 
            'status'      => $row['i1_status'],
            'mod_date'    => $row['i1_mod_date']
            );
        if ( !empty( $row['i2_image_name'] ) ) {
            $imageGroup[$groupName][] = array(
                'image_name'  => $row['i2_image_name'],
                'comments'    => $row['i2_comments'], 
                'status'      => $row['i2_status'],
                'mod_date'    => $row['i2_mod_date']
            );
        }
    }

置換:

if (!isset($imageGroup[$groupName]) {   
    $imageGroup[$groupName] = array();

    $sql_2 = "SELECT * FROM images WHERE image_name like '%".$groupName."%'";
    $result_2 = mysql_query($sql_2,$connection);
    while($row - mysql_fetch_assoc($result_2)) {
        $imageGroup[$groupName][] = array( // sort each field as 
            'image_name' => $row['image_name'],
            'comments' => $row['comments'], 
            'status' => $row['status'], // determines whether image is rated or unrated
            'mod_date' => $row['mod_date'] // the date we need to compare
            );
    }
}
else {
    for ($i=0; $i <sizeof($imageGroup[$groupName]); $i++) {
        if ($imageGroup[$groupName][$i]['status'] == 0) {
        // compare??    

        }
        if ($imageGroup[$groupName][$i]['status'] !== 0) {
        // compare??    

        }


    }
}

完了$imageGroup[$groupName]すると、1 つまたは 2 つの要素を持つ配列が含まれます。

これが狙い通りであることを願っています。:)

于 2013-09-05T22:41:55.250 に答える
0

使用できる古いコードは次のとおりです。

class ProductHelper {

// sort products by name
static function sort_name_asc($a,$b) {
    return strcmp($a['name'],$b['name']);
}
static function sort_name_desc($a,$b) {
    return strcmp($b['name'],$a['name']);
}
// sort products by price
static function sort_price_asc($a,$b) {
    return $a['price'] > $b['price'];
}
static function sort_price_desc($a,$b) {
    return $a['price'] < $b['price'];
}
// sort products by last update
static function sort_date_asc($a,$b) {
    return $a['created'] > $b['created'];
}
static function sort_date_desc($a,$b) {
    return $a['created'] < $b['created'];
}
// sort array by sort_order
static function sort_sort_order($a,$b) {
    return $a['sort_order'] > $b['sort_order'];
}

    function sortProducts($products, $sortMode) {
        if (!is_array($products)) return null;
        usort($products, 'ProductHelper::sort_'.$sortMode);
        return $products;
    }

}

使用例:

$ProductHelper = new ProductHelper();
$ProductHelper->sortProducts($array_of_products, "date_desc");
于 2013-09-05T21:39:44.220 に答える