我有一系列名字和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。
注意:此数组将包含许多不同的值(并非所有纽约,我只是用它们作为示例)
现在我怎么开始呢?
答案 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 :(得分: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
}