2010-07-28 58 views
4

我有一个深而长的矩阵(矩阵)。我只知道产品ID。 如何找到产品的方式?php,长矩阵和深矩阵

样品数组(但正如我所说,它可以是非常漫长而深):

Array(
     [apple] => Array(
       [new] => Array(
         [0] => Array([id] => 1) 
         [1] => Array([id] => 2)) 
       [old] => Array(
         [0] => Array([id] => 3) 
         [1] => Array([id] => 4)) 
      ) 
) 

我有ID:3,我希望得到这样的: 苹果,老,0

感谢

+0

嗯,你的意思是一个upheap类的东西? – 2010-07-28 19:47:37

回答

1

您可以使用此宝贝:

function getById($id,$array,&$keys){ 
    foreach($array as $key => $value){ 
    if(is_array($value)){ 
     $result = getById($id,$value,$keys); 
     if($result == true){ 
      $keys[] = $key; 
      return true; 
     } 
    } 
    else if($key == 'id' && $value == $id){ 
     $keys[] = $key; // Optional, adds id to the result array 
     return true; 
    } 
    } 
    return false; 
} 
// USAGE: 
$result_array = array(); 
getById(3, $products, $result_array); 
// RESULT (= $result_array) 
Array 
(
    [0] => id 
    [1] => 0 
    [2] => old 
    [3] => apple 
) 

函数本身愿买电子健康l成功时返回true,错误时返回false,您想要的数据将存储在第三个参数中。

您可以使用array_reverse()link,扭转秩序和array_pop()link,除去最后一个项目(“ID”)

+0

你的选择“你可以使用这个宝贝:”真的让我感到奇怪... – jordanstephens 2010-07-28 20:41:26

+0

我应该编辑它吗? – Ties 2010-07-28 20:43:27

1

递归是对这类问题的答案。不过,如果我们可以对数组的结构某些假设(即“ID”始终是一个没有孩子的叶节点)有进一步的优化可能:

<?php 
$a = array(
    'apple'=> array(
     'new'=> array(array('id' => 1), array('id' => 2), array('id' => 5)), 
     'old'=> array(array('id' => 3), array('id' => 4, 'keyname' => 'keyvalue')) 
    ), 
); 

// When true the complete path has been found. 
$complete = false; 

function get_path($a, $key, $value, &$path = null) { 
    global $complete; 
    // Initialize path array for first call 
    if (is_null($path)) $path = array(); 
    foreach ($a as $k => $v) { 
     // Build current path being tested 
     array_push($path, $k); 
     // Check for key/value match 
     if ($k == $key && $v == $value) { 
      // Complete path found! 
      $complete= true; 
      // Remove last path 
      array_pop($path); 
      break; 
     } else if (is_array($v)) { 
      // **RECURSION** Step down into the next array 
      get_path($v, $key, $value, $path); 
     } 
     // When the complete path is found no need to continue loop iteration 
     if ($complete) break; 
     // Teardown current test path 
     array_pop($path); 
    } 
    return $path; 
} 

var_dump(get_path($a, 'id', 3)); 
$complete = false; 
var_dump(get_path($a, 'id', 2)); 
$complete = false; 
var_dump(get_path($a, 'id', 5)); 
$complete = false; 
var_dump(get_path($a, 'keyname', 'keyvalue')); 
+0

你可以在不使用'global' var的情况下做到这一点,如果你这样做,它会是一个更好的例子。 – 2010-08-02 20:45:41

+0

@Mark:这是一个简单的例子 - 可以轻松地重构为使用“static $ complete”变量声明。随意发布您自己的解决方案! – leepowers 2010-08-02 21:09:27

-1

如果你曾经创建数组,并用它多次我会做另一种方式......


当建立初始阵列创建另一个


$id_to_info=array(); 
$id_to_info[1]=&array['apple']['new'][0]; 
$id_to_info[2]=&array['apple']['new'][2]; 
+0

为什么我得到-1,我很好奇? – 2010-08-03 06:12:04

0

我想这对我的编程工作。

<?php 

$data = array(
    'apple'=> array(
     'new'=> array(array('id' => 1), array('id' => 2), array('id' => 5)), 
     'old'=> array(array('id' => 3), array('id' => 4)) 
    ), 
); 

####print_r($data); 

function deepfind($data,$findfor,$depth = array()){ 
    foreach($data as $key => $moredata){ 
     if(is_scalar($moredata) && $moredata == $findfor){ 
      return $depth; 
     } elseif(is_array($moredata)){ 
      $moredepth = $depth; 
      $moredepth[] = $key; 
      $isok = deepfind($moredata, $findfor, $moredepth); 
      if($isok !== false){ 
       return $isok; 
      } 
     } 
    } 
    return false; 
} 

$aaa = deepfind($data,3); 
print_r($aaa);