从数组中拉出第一个匹配项

时间:2015-06-05 11:40:43

标签: php arrays sorting

我有一个数组:

Array
(
    [user1] => Array
    (
        [id] => 1
        [name] => 'john'
        [types] => null
    )
    [user2] => Array
    (
        [id] => 2
        [name] => 'jane'
        [types] => Array(
            [t_id] => 2
        )
    )
    [user3] => Array
    (
        [id] => 3
        [name] => 'jeff'
        [types] => null
    )
    [user4] => Array
    (
        [id] => 4
        [name] => 'steve'
        [types] => Array(
            [t_id] => 1
        )
    )
    [user5] => Array
    (
        [id] => 5
        [name] => 'rob'
        [types] => Array(
            [t_id] => 2
        )
    )

我需要找出t_id为1的第一个用户以及t_id为2的第一个用户

因此,在上面,Jane将是第一个t_id为2的用户,而Steve将是第一个t_id为1的用户。

我知道我可以遍历数组:

 private $tid1;
 private $tid2;

 foreach($data as $_v) {
     if($_v['types']['t_id'] === 1) $tid1 = $_v;
     if($_v['types']['t_id'] === 2) $tid2 = $_v;
 }

这看起来似乎效率低下,并且由于循环将继续运行,上述情况不会完全发挥作用,以后出现的t_id将替换变量。

有更有效的方法吗?

6 个答案:

答案 0 :(得分:0)

要修复循环解决方案并在第一次出现时停止,您可以检查是否已经找到了决定。

 if(!$tid1 && $_v['types']['t_id'] === 1) $tid1 = $_v;

'的foreach'因为解决方案通常足够有效。特别是在您需要查看多个条件的情况下。

答案 1 :(得分:0)

也许这会奏效。

 foreach($data as $_v) {
   if(!$tid1 && isset($_v['types']['t_id']) && $_v['types']['t_id'] === 1) $tid1 = $_v;
   if(!$tid2 && isset($_v['types']['t_id']) && $_v['types']['t_id'] === 2) $tid2 = $_v;

   if ($tid1 && $tid2) break;
 }

答案 2 :(得分:0)

我的方法:

org.apache.commons.io.FileUtils.moveDirectory(srcDir, destDir);

答案 3 :(得分:0)

尝试使用array_walkarray_unique作为

$result = array();
array_walk($arr, function($v,$k) use(&$result){ if($v['types'] !== null){ $result[$v['name']] = $v['types']['t_id'];};});
$users = array_unique($result);

DEMO

答案 4 :(得分:0)

拥有'目标ID'在数组中。

  • 扫描$ user数组并检查是否与任何'目标ID'。
  • 匹配
  • 如果匹配:添加到结果并从'目标ID'
  • 中删除
  • 停止目标ID'列表是空的。

代码:

$targetIds = array(3, 2, 1); // required list of ids
$result = array();

while (current($users) && !empty($targetIds)) {

    $cuKey = key($users);
    $cu = current($users);

    if (    !empty($cu['types']['t_id'])
         &&  in_array($cu['types']['t_id'], $targetIds)) { // process match

        $result[$cuKey] = $cu;
        $targetIds = array_diff($targetIds, array($cu['types']['t_id'])); // remove processed
    }

    next($users);
}

var_dump($result, $targetIds);

答案 5 :(得分:-1)

你可以在找到你的td时停止循环:

foreach($data as $_v) {
 if(($_v['types']['t_id'] === 1) && !$tid1) $tid1 = $_v;
 if(($_v['types']['t_id'] === 2) && !$tid2) $tid2 = $_v;

 if($tid1 && $tid2) break;
}