PHP,多维数组,查找键并从数组中返回值

时间:2020-08-09 21:56:33

标签: php arrays wordpress multidimensional-array

好的,所以我尝试进行搜索并进行了48小时的研究,但我一直感到头疼,非常感谢我在哪里做错了事。

因此,在我的用例中,我有一个Wordpress网站,我试图基于csv列表以编程方式为帖子设置默认标签,然后将其上传到后端并转换为Array。当页面加载到数组内部时,我需要能够搜索特定字段,然后拉出键值以馈入wp_set_post_tags()参数。这是我到目前为止的内容:

    $sku_file_upload = get_field( 'sku_file_upload', 'option' );
$skufileurl = $sku_file_upload['url'];
$skulist = array();
$term_name = get_field('mold_sku');
$rows = file($skufileurl);
$header = array_shift($rows); //get the header out
$header = explode(",", $header);
$final_array = array();

foreach ($rows as $row) {
    $row = explode(",", $row);
    $header[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $header[3]);
    $row[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $row[3]);
    $row[3] = str_replace(array("|"), ',', $row[3]);
    $final_array[] = array($header[0] => $row[0], $header[1] => $row[1], $header[2] => $row[2], $header[3] => $row[3]);
}

这完全可以按预期方式工作,并为我提供了以下数组(41个值,在此处缩小以供查看):

(
    [0] => Array
        (
            [Mold SKU] => 12MM-SM-SQ
            [Title] => 12mm Squares
            [Category] => Earings|Earings > Fishhooks
            [Tags] => square ,
        )

    [1] => Array
        (
            [Mold SKU] => 12MM-SQ-HOLLOW-DROP
            [Title] => Square Hollow Drop Studs
            [Category] => Earings|Earings > Studs
            [Tags] => square ,
        )

)

总体而言,我曾考虑过修改代码以提供另一种搜索方式,但无法弄清楚如何使其工作,但也会显示该版本。唯一的变化是对上面的最后一个foreach循环,以提供我在关联数组名称中的每个帖子上寻找的值:

foreach ($rows as $row) {
    $row = explode(",", $row);
    $header[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $header[3]);
    $row[3] = str_replace(array("\r\n", "\n\r", "\n", "\r"), '', $row[3]);
    $row[3] = str_replace(array("|"), ',', $row[3]);
    $final_array[$row[0]] = array($header[1] => $row[1], $header[2] => $row[2], $header[3] => $row[3]);
}

哪些可以给我以下内容?

Array
(
    [12MM-SM-SQ] => Array
        (
            [Title] => 12mm Squares
            [Category] => Earings|Earings > Fishhooks
            [Tags] => square ,
        )

    [12MM-SQ-HOLLOW-DROP] => Array
        (
            [Title] => Square Hollow Drop Studs
            [Category] => Earings|Earings > Studs
            [Tags] => square ,
        )
)

但是我离题,只是想提出这一点,以防它提供解决问题的更好方法。因此,有了该代码后,我便在页面加载上执行以下代码,以查看一切是否正常:

foreach ($final_array as $value){

    echo '<pre>';
    print_r($value['Mold SKU']);
    echo '</pre>';

令人失望的是,我得到了大量空白行,但是如果我用其他任何键(显然是第一个示例中的“ Title”,“ Category”或“ Tags”)替换print_r,情况并非如此。

我想知道发生了什么,是否与-键有关?我不这么认为,因为我将其取出并仍然获得相同的结果。

我永远都无法超越这个阶段,但这是我理想中想要做的:

我在每个页面的后端都有一个自定义字段,即“ mold_sku”,我希望该值成为我在数组中搜索的值。因此,例如当前页面上的SKU可能是“ 12MM-SQ-HOLLOW-DROP”,我想浏览一下我创建的$ final_array,找到该值,然后我需要提取“ Tags”值并插入它们放入wp_set_post_tags()参数。这是我预想的方式:

  1. 遍历数组,并通过定义为$ term_name = get_field('mold_sku');的$ term_name搜索来查找包含我需要的值的子数组。并将其输入$ mold_sku。

  2. 使用该变量执行:

wp_set_post_tags($ post_id,$ tags,true);

我不会在这里放入我尝试过的所有forloop变量,因为它不会使事情变得更加清晰(至少我不这么认为),而且我已经感觉很清澈了。< / p>

感谢所有可以帮助我指出正确方向的帮助。

编辑

执行此操作的更好方法是在多维数组中搜索需要的信息的数组,并返回该值的数组以便我可以对其进行操作?

CSV供参考

Mold SKU,Title,Category,Tags
12MM-SM-SQ,12mm Squares,Earings|Earings > Fishhooks,square |
12MM-SQ-HOLLOW-DROP,Square Hollow Drop Studs,Earings|Earings > Studs,square |
12MM-SQ-O-CUTOUT,Square O Cutouts,Earings|Earings > Fishhooks,square | o | 
13MM-CIRCLES,13mm Circles,Earings|Earings > Fishhooks,circle |
14MM-SS-STUD,Studs,Earings|Earings > Studs,metal|stainless-steel |
14MM-TRI,Triangles,Earings|Earings > Fishhooks,triangle |
16MM-SS-CIRCLES,Stainless Steel Circles,Earings|Earings > Fishhooks,metal|stainless-steel | 
17MM-BBALL-DIAMONDS,17mm Baseball Diamonds,Earings|Earings > Fishhooks,baseball-diamond|
17MM-BBALL-DIAMOND-STUD,17mm Baseball Diamond Studs,Earings|Earings > Studs,baseball-diamond|
17MM-ROUND-CROSS,Rounded Cross,Earings|Earings > Fishhooks,round-cross |
18MM-DROPS,Drops,Earings|Earings > Fishhooks,drop|
18MM-STAR,Gold Stars,Earings|Earings > Fishhooks,star | 
19MM-OVAL,Ovals,Earings|Earings > Fishhooks,oval|
20MM-CIRCLES,Circles,Earings|Earings > Fishhooks,circle|
25MM-CIR-CUT,25mm Circle Cutouts,Earings|Earings > Fishhooks,circle | 
26MM-RECT-BAR,26mm Rectangle Bars,Earings|Earings > Fishhooks,rectangle-bars|
28MM-SQ-HOLLOW,Hollow Squares,Earings|Earings > Fishhooks,square | 
30MM-LEAVES,Leaves,Earings|Earings > Fishhooks,leaf|
33MM-SKIMBOARD,Skimboards,Earings|Earings > Fishhooks,skim-board | 
36MM-LONG-TRI,Long Triangles,Earings|Earings > Fishhooks,triangle | 
38MM-DIAMOND,Diamonds,Earings|Earings > Fishhooks,diamond | 
38MM-DIAMOND-CUT,Diamond Cutouts,Earings|Earings > Fishhooks,diamond |
39MM-PENTAKINDAGON,Pentakindagon,Earings|Earings > Fishhooks,pentagon | 
40MM-CIR-CUTOUT,Circle Cutouts,Earings|Earings > Fishhooks,circle|
56MM-SQ-WIN,Square Windows,Earings|Earings > Fishhooks,square | 
9MMCIR-19MMOVAL-STUD,Circle Oval Studs,Earings|Earings > Studs,oval|
CIR-CAPSULE-CUT-STUD,Circle Capsule Cutouts,Earings|Earings > Fishhooks,capsule|circle | 
CIRCLE-SQ-STUD,Circle Hollow Square Studs,Earings|Earings > Studs,square|
CIR-CUT-SQ-CUT,Circle Squares,Earings|Earings > Fishhooks,circle|square | 
CIR-SQ-CUT-STUD,Circle Square Cutout Studs,Earings|Earings > Studs,circle|square | 
HOLLOW-DROP,Hollow Drops,Earings|Earings > Fishhooks,drop|
SQ-CUT-STUD,Square Cutout Studs,Earings|Earings > Studs,square | 
SS-PRISM,Hollow Prisms,Earings|Earings > Fishhooks,metal|stainless-steel | 
TRI-STUD,Triangles,Earings|Earings > Fishhooks,triangle | 
OBTUSE-TRI,Obtuse Triangle,Earings | Earings > Fishhooks,triangle | 
CIR-SIDE-SQ-CUTOUT,Circle Side Square Cutout Studs,Earings|Earings > Studs,circle | square | 
CIR-CLOUD,Circle Cloud Studs,Earings|Earings > Studs,circle | cloud | 
LINK-CHEVRON,Link Chevrons,Earings | Earings > Fishhooks,chevron | link | 
DIAMOND-CHEVRON,Diamond Chevrons,Earings | Earings > Fishhooks,chevron | diamond | 
9MM-CIR,9mm Circles,Earings | Earings > Fishhooks,circle | 
11MM-CIR,11mm Circle Studs,Earings|Earings > Studs,circle | 

1 个答案:

答案 0 :(得分:0)

ini_set('auto_detect_line_endings', true);

$fp = fopen($skufileurl, 'r');
$termName = 'Example SKU';

$csvHeader = fgetcsv($fp);
while ($csvRow = fgetcsv($fp)) {
    $keyedCsvRow = array_combine($csvHeader, $csvRow);

    if ($keyedCsvRow['Mold SKU'] === $termName) {
        $keyedCsvRow['Category'] = explode('|', $keyedCsvRow['Category']);
        $keyedCsvRow['Tags'] = explode('|', $keyedCsvRow['Tags']);
        
        $finalArray = $keyedCsvRow;
        break;
    }
}

fclose($fp);

工作example

引用

  • fopen-获取文件指针
  • fgetcsv-将行解析为csv,以数组形式返回
  • array_combine-使用第一个数组作为键,第二个用作值

其他信息

  • wp_set_post_tags接受标签作为数组,因此您可以按原样传递标签$finalArray['Tags']
  • 看看JSON(json_encodejson_decode)。这是保存sku文件的更好格式。将取代CSV。数组中的数组将是显而易见的。

您的问题应该是什么样的

标题:从csv文件中解析和过滤数据

嗨,我正在尝试读取Tags的csv文件,如下所示:

// example data of csv file (with header!)

对于给定的Tags,我需要获取所有$term_name,该Mold SKU必须与// code attempt (+optionally comment where you got stuck) 相匹配。这就是我尝试过的。

document.body.addEventListener('change', event => {
    const masterElement = document.getElementById(event.target.id + 'Master');

    if (masterElement !== null) {
        masterElement.value = event.target.value;
        ReDraw();
    };
});

非常感谢您的帮助:)

快乐编码:)

相关问题