数组最高值还是创建下一个值?

时间:2011-01-18 15:22:10

标签: php

我有一系列名字和id。

Array(
    0=>array(
        name=>New York, 
        id=>45763448349, 
        can=0
    ),
    1=>array(
        name=>New York2, 
        id=>45763464566, 
        can=0
    ),
    3=>array(
        name=>New York3, 
        id=>45763464854, 
        can=0
    ),
    4=>array(
        name=>New York4, 
        id=>45763464955, 
        can=0
    ),
    5=>array(
        name=>New York5, 
        id=>45763464745, 
        can=0
    ),
    6=>array(
        name=>New York6, 
        id=>45763464235, 
        can=1
    )
)

例如(将有不同的名称(不是所有纽约))并且我有一个带有名称的x变量(例如x =纽约)我需要做的是找到最高的名称并获取id和然后确保can是1,否则具体是下一个最高名称。

例如,假设我有x = New York,所以我查看数组并发现最高的数组名称是New York6。我看到can = 1所以我得到了id。现在,如果可以!= 1然后我可以具体纽约7。

注意:此数组将包含许多不同的值(并非所有纽约,我只是用它们作为示例)

现在我怎么开始呢?

4 个答案:

答案 0 :(得分:2)

在代码中:

function city_cmp($record_a, $record_b) {  
  return strcmp($record_a["name"], $record_b["name"];
}

usort($cities, 'city_cmp');
end($cities);
$city = current($cities);
do {
    if ($city["can"] === 1) { 
         $can_city = $city;
         break;
    }

} while ($city = prev($cities));

注意:您可以选择跳过break并使$can_city成为您的while条件的一部分。有些人更喜欢这样,因为它可以使循环退出条件更清晰。

快速步骤:

  1. usort()数组

  2. 使用end()指向数组末尾和prev(),直到找到can = 1.

答案 1 :(得分:1)

由于它是一个多维数组(我称之为$ array),你可能需要遍历它一次才能找到相关的数据。

$highest_id = array('id' => 0, 'count' => 0, 'can' => 0);
for each ( $array AS $key => $data )
{
  if ( substr($data['name'],0,strlen($x)) == $x )
  {
    $current_count = (int) substr($data['name'],strlen($x));
    if ( $current_count > $highest_id['count'] )
    {
      $highest_id = array('id' => $data['id'], 'count' => $current_count, 'can' => $data['can']);
    }
  }
}
if ( $highest_id['can'] == 1 )
{
  $id = $highest_id['id'];
}
else
{
 // can is not 1 => specify new $x
}

答案 2 :(得分:0)

这样的事情:

//$my_array is your array of values
//$string = 'New York'; your search term
$id = false;
for($i = count($my_array) - 1; $i >= 0; $i++) {
    if($id === false) {
        if(strpos($my_array[$i]['name'], $string) !== false && $my_array[$i]['can'] == 1) {
            $id = $my_array[$i]['id'];
        }
    }
}
//Insert it if no id was found
if($id === false) {
    $id = 'something';
    $can = 1;
    array_push($my_array, array('name' => $string, 'id' => $id, 'can' => $can));
}

这有用吗?

修改 (如果不明显,$string就是你要搜索的内容)

答案 3 :(得分:0)

首先将您的任务划分为较小的任务。第一个过滤条件似乎是can=1。我们用array_filter检查一下。

$ar = array(array('name'=>'New York', 'id'=>45763448349, 'can'=>1), array('name'=>'New York2', 'id'=>45763464566, 'can'=>0), array('name'=>'New York3', 'id'=>45763464854, 'can'=>0), array('name'=>'New York4', 'id'=>45763464955, 'can'=>0), array('name'=>'New York5', 'id'=>45763464745, 'can'=>0), array('name'=>'New York6', 'id'=>45763464235, 'can'=>1), array('name'=>'New Yorkistan', 'id'=>0, 'can'=1));
$ar = array_filter($ar, function($el) {return $el['can'];});
// Now $ar contains the entries 'New York', 'New York2', and 'New Yorkistan'

现在,过滤掉与New York(和数字)不匹配的条目。

$ar = array_filter($ar, function($el) {
    $search = 'New York';
    $name = $ar['name'];
    $potentialNumber = substr($name, strlen($search));
    return ((substr($name, 0, strlen($search)) == $search) && // starts with NY
            ($potentialNumber == '' || is_numeric($potentialNumber)); // [0-9]*
});
// $ar contains only 'New York' and 'New York6' now

现在,您只需要使用usort进行一些排序并选择第一个元素:

usort($ar, function($el1, $el2) {
    $id1 = $el1['id']; $id2 = $el2['id'];
    if ($id1 == $id2) return 0;
    return $id1 < $id2 ? 1 : -1;
});
if (count($ar) > 0) {
    $result = $ar[0];
} else {
    // Nothing matched your criteria
}