2010-07-28 63 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);