在多维数组中搜索并返回其他键值

时间:2016-01-12 12:28:38

标签: php arrays multidimensional-array

我有以下内容 Multidimensional array.

我尝试做的是搜索IDITEM值,如果找到了,则返回" PRECO"的值。键。

我使用以下功能检查该值是否存在且工作正常,但我无法找到一种方法来获得" PRECO"找到的IDITEM的值。

功能:

function search_array($needle, $haystack) {
 if(in_array($needle, $haystack)) {
      return true;
 }
 foreach($haystack as $element) {
      if(is_array($element) && search_array($needle, $element))
           return true;
 }
 return false;
}

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:1)

我能记住的最简单的想法是将布尔值search_array转换为路径创建者,它将返回项目的路径,如果找不到,则返回 false

function get_array_path_to_needle($needle, array $haystack) 
{
  if(in_array($needle, $haystack)) 
  {
    return true;
  }

  foreach($haystack as $key => $element) 
  {
    if(is_array($element) && ($path = get_array_path_to_needle($needle, $element)) !== false)
    {
      return $path === true ? $key : $key . '.' . $path;
    }
  }

  return false;
}

然后,由于您已经拥有该路径,因此请重新运行该数组以获取该项

function get_array_value_from_path(array $path, array $haystack)
{
  $current = $haystack;
  foreach($path as $key) 
  {
    if(is_array($current) && array_key_exists($key, $current))
    {
      $current = $current[$key];
    }
    else
    {
      return false;
    }
  }

  return $current;
}

这不会让你获得PRECO,但它将返回id(数组),其中id找到你搜索的值。

所以一个简单的用法是:

$path = get_array_path_to_needle('000000000000001650', $data);
$item = get_array_value_from_path(explode('.', $path), $data);
// here you have full array for that item found
print_r($item);
// here you have your price
print_r($item['PRECO']);

答案 1 :(得分:1)

您可以更改第一个if语句以返回它而不是返回布尔值:

function search_array($needle, $haystack) {
    if(in_array($needle, $haystack) && array_key_exists('PRECO', $haystack)) {
        return $haystack['PRECO'];
    }
    foreach($haystack as $element) {
        if(is_array($element))
        {
            $result = search_array($needle, $element);
            if($result !== false)
                return $result;
        }
    }
    return false;
}

答案 2 :(得分:1)

使用static变量记住多个函数调用之间的状态,并存储所需的PRECO值。它使函数在多次调用之间记住给定变量(在此示例中为$needle_value)的值。

所以你的search_array()函数应该是这样的:

function search_array($needle, $haystack){
    static $needle_value = null;
    if($needle_value != null){
        return $needle_value;
    }
    foreach($haystack as $key => $value){
        if(is_array($value)){
            search_array($needle, $value);
        }else if($needle == $value){
            $needle_value = $haystack['PRECO'];
            break;
        }
    }
    return $needle_value;
}

此函数最终将返回$needle_value,这是您从干草堆中获得的所需PRECO值。

答案 3 :(得分:1)

最简单的方法是使用foreach循环两次。检查密钥并将结果存储到数组中以供以后使用。

根据你的数组,下面的

$search = '000000000000001650';

foreach($array as $element){
    foreach ($element['ITEM'] as $item){
        if (isset($item['IDITEM']) and $item['IDITEM'] == $search){
            $results[] = $item['PRECO'];
        }
    }
}

print_r($results);

将输出

Array
(
    [0] => 375
)

答案 4 :(得分:0)

以下是数组的简单示例:

// your array with two indexes
$yourArr = array(
        0=>array(
                'IDDEPARTAMENTO'=>'0000000001',
                'DESCRDEPT'=>'Área',
                'ITEM'=>
                array(
                    array(
                        'SETID'=>'RX',
                        'IDITEM'=>'000000000000001367',
                        'DESCRITEM'=>'PISTA TESTE DRIV',
                        'PRECO'=>'1338.78'),
                    array(
                        'SETID'=>'RX',
                        'IDITEM'=>'000000000000001925',
                        'DESCRITEM'=>'PISTA TESTE DRIV2',
                        'PRECO'=>'916'),
                )

            ),
        1=>array(
                'IDDEPARTAMENTO'=>'0000000010',
                'DESCRDEPT'=>'Merch',
                'ITEM'=>
                array(
                    array(
                        'SETID'=>'RX',
                        'IDITEM'=>'000000000000002036',
                        'DESCRITEM'=>'PISTA TESTE DRIV23',
                        'PRECO'=>'200.78'),
                    array(
                        'SETID'=>'RX',
                        'IDITEM'=>'000000000000001608',
                        'DESCRITEM'=>'PISTA CRACHÁ  DRIV4',
                        'PRECO'=>'44341'),
                )                       
        ));

// solution
$newArr = array();
foreach ($yourArr as $value) {
    foreach ($value as $key => $innerVal) {
        if($key == 'ITEM'){
            foreach ($innerVal as $key_inner => $keyinner) {
                if(!empty($keyinner['IDITEM'])){
                    $newArr[$keyinner['IDITEM']] = $keyinner['PRECO'];
                }
            }
        }
    }
}

echo "<pre>";
print_r($newArr);

IDITEM的结果值:

Array
(
    [000000000000001367] => 1338.78
    [000000000000001925] => 916
    [000000000000002036] => 200.78
    [000000000000001608] => 44341
)